Preorder Tree Traversal

Preorder Traversal adalah proses kunjungan pada graph pohon dimana penandaan kunjungan dilakukan di awal yaitu ketika node untuk pertama kali terkunjungi. Urutan kunjungan mengikuti kaidah depth first search order. Secara sekilas persoalan preorder traversal seperti persoalan sekuensial.  Coba perhatikan fungsi rekursif di bawah ini :

openstat_preorder_tree_traversal_algorithm1

Dimana parallelisme nya ? Kita akan melihat bahwa cara pandang dengan vertex sebagai fokusnya akan menyebabkan kita melihat persoalan ini sebagai persoalan sekuensial murni yang tidak ada proses paralel nya.

Sekarang, mari kita lihat dengan cara pandang yang berbeda. Mari kita pandang ruas/edge dari graph ini. Kita melihat bahwa ketika perjalanan kunjungan graph dilakukan, maka setiap ruas/edge akan dilewati 2 (dua) kali dengan arah yang berlawanan, turun dan naik. Jika kita pisahkan setiap ruas/edge ini menjadi 2, yang pertama menjadi ruas turun, dan yang satu lagi menjadi ruas naik,  maka sekarang kita akan melihat persoalan preorder traversal ini menjadi sebuah persoalan  singly-linked list.

Cara pandang terhadap ruas/edge inilah yang menjadikannya sebagai persoalan yang dapat diparalelkan dengan sebuah algoritma yang cepat. (dipublikasikan oleh Tarjan dan Vishkin 1984).

Selanjutnya mari kita bahas algoritma ini dengan lebih rinci. Algoritma ini memiliki 4 fase. Pada fase pertama, algoritma akan membentuk sebuah singly-linked list. Setiap vertex/simpul dari singly-linked list ini akan berkait dengan ruas penelusuran naik atau ruas penelusuran turun di dalam tree.

openstat_preorder_tree_traversal_algorithm2

Pada fase kedua, algoritma akan memberikan bobot kepada semua vertex/node dari singly-linked list yang baru dibuat tersebut. Pada algoritma preorder traversal, sebuah vertex/node diberi label/tanda segera saat dilewati traversal/penelusuran edge yang turun. (Vertex root adalah pengecualian dan harus ditangani secara khusus). Untuk itu pada setiap vertex/node yang terkait dengan penelusuran edge turun diberi bobot 1 (satu)., artinya hitungan node nya bertambah ketika ruas/edge nya ditelusuri. Kemudian daftarkan element-element yang terakit dengan ruas/edge naik dengan bobot 0 (nol), karenanya hitungan node nya tidak akan bertambah ketika penelusuran pohon melaluinya saat menuju node yang sudah diberi label/tanda sebelumnya. 

openstat_preorder_tree_traversal_algorithm3

Pada fase ketiga kita menghitung rank dari daftar element untuk setiap elemen di sinly-linked list.

 

openstat_preorder_tree_traversal_algorithm4

Langkah/fase keempat, prosesor2 yang memegang ruas turun menggunakan rank yang sudah dihitung olehnya untuk memberikan angka penelusuran/traversal preorder pada node-2 yang terkait dengannya (node di akhir ruas turun)

openstat_preorder_tree_traversal_algorithm5

 

Implementasi alogritma ini menggunakan sturktur data yang tidak biasa dalam menampilkan pohon/tree nya.

openstat_preorder_tree_traversal_algorithm7

 

Untuk setiap tree node, struktur data menyimpan : parent dari node, sibling langsung yang berada di kanannya (immediate sibling to the right) dan anak paling kiri (leftmost child).

Algoritma di bawah ini adalah algoritma PRAM untuk preorder tree traversal. Algoritma ini memasangkan setiap prosesor dengan setiap ruas/edge yang ditelusuri. Sebuah pohon/tree dengan buan node akan memiliki n-1 buah ruas/edge. Karena kita membagi setiap ruas/edge menjadi ruas turun dan ruas naik , maka algoritma ini membutuhkan 2(n-1) buah prosesor untuk menghitung 2(n-1) elemen dari singly-linked list.

Setelah semua prosesor dalam keadaan aktif, mereka akan segera membentuk linked list yang terkait dengan preorder traversal. Diberikan ruas/edge (i,j), setiap prosesor harus menghitung penerusnya/successor dari ruas/edge tersebut dalam penelusurannya.  Jika parent[i]=j, ruasnya akan menuju kebagian atas dari pohon, dari node anak ke parent nya. Ruas naik memiliki tiga macam successor. Jika anak  memiliki sebuah sibling ruas successor akan bergerak dari parent node menuju ke sibling nya, selain itu jika anak memiliki kakek/grandparent , maka ruas successor akan bergerak dari node parent ke node kakek/grandparent nya. Jika kedua kondisi tersebut tidak terpenuhi maka artinya ruas berada di akhir/ujung dari pohon traversal, jadi selanjutnya kita letakkan sebuah loop di ujung dari daftar elemen ini. Dalam kasus ini kita juga mengetahui identitas dari node root/akar, dan kita jadikan nomor preordernya menjadi 0.

Berikutnya kita perhatikan kasus  \(parent[i] \neq j\) ; dimana ruas bergerak turun di dalam pohon, dari node parent ke anaknya. Hanya ada dua macam successor edge. Jika node anaknya memiliki anak, maka successor nya adalah edge dari anak ke cucunya. Selain itu, node anak adalah daun dan successor adalah ruas dari anak menuju parent nya.

Setelah prosesor membentuk linked list, mereka akan memberikan nilai posisi 1 untuk elemen yang merupakan ruas turun dan 0 untuk elemen yang merupakan ruas naik.

Nilai akhir dari nilai posisi ini menunjukkan angka penelusuran preorder antara daftar elemen ke ujung dari list. Untuk menghitung lebel dari setiap node preorder traversal, setiap prosesor dihubungkan dengan  ruas turun dan dikurangangi nilai position nya dari n+ 1. Penamahan 1 karena penomoran preorder traversal dimulai dari 1 bukan 0

 

openstat_preorder_tree_traversal_algorithm6

Leave a Reply

Your email address will not be published. Required fields are marked *

Captcha Captcha Reload