{"id":32824,"date":"2025-10-26T09:40:56","date_gmt":"2025-10-26T06:40:56","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32824"},"modified":"2025-10-26T09:40:56","modified_gmt":"2025-10-26T06:40:56","slug":"ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/","title":{"rendered":"\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile"},"content":{"rendered":"<p><body><\/p>\n<h2>\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Bilgisayar bilimlerinde veri yap\u0131lar\u0131 ve algoritmalar, verimli ve \u00f6l\u00e7eklenebilir yaz\u0131l\u0131m geli\u015ftirmek i\u00e7in temel ta\u015flard\u0131r. Bu yap\u0131lar\u0131n do\u011fru se\u00e7imi, bir uygulaman\u0131n performans\u0131n\u0131 dramatik bir \u015fekilde etkileyebilir. Bu makalede, s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan ve bir\u00e7ok pratik senaryoda kritik rol oynayan iki \u00f6nemli veri yap\u0131s\u0131n\u0131 ele alaca\u011f\u0131z: \u00d6ncelik Kuyruklar\u0131 (Priority Queues) ve \u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps). \u00d6zellikle, bu kavramlar\u0131 JavaScript dilinde nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 ve kullanaca\u011f\u0131m\u0131z\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<p>\u00d6ncelik kuyruklar\u0131, elemanlar\u0131n s\u0131radan bir kuyruktan farkl\u0131 olarak \u00f6nceliklerine g\u00f6re i\u015flendi\u011fi soyut bir veri t\u00fcr\u00fcd\u00fcr. Geleneksel kuyruklar &#8220;\u0130lk Giren \u0130lk \u00c7\u0131kar&#8221; (FIFO) prensibine g\u00f6re \u00e7al\u0131\u015f\u0131rken, \u00f6ncelik kuyruklar\u0131 &#8220;En Y\u00fcksek \u00d6ncelikli \u0130lk \u00c7\u0131kar&#8221; prensibini benimser. Bu \u00f6zellik, i\u015fletim sistemlerindeki g\u00f6rev zamanlamadan a\u011f algoritmalar\u0131na, yapay zeka aramalar\u0131ndan sim\u00fclasyonlara kadar geni\u015f bir uygulama yelpazesinde onlar\u0131 vazge\u00e7ilmez k\u0131lar.<\/p>\n<p>\u0130kili y\u0131\u011f\u0131nlar ise, \u00f6ncelik kuyruklar\u0131n\u0131n en yayg\u0131n ve verimli implementasyonlar\u0131ndan biridir. Bir tam ikili a\u011fa\u00e7 (complete binary tree) yap\u0131s\u0131na sahip olan ikili y\u0131\u011f\u0131nlar, elemanlar\u0131n belirli bir &#8220;y\u0131\u011f\u0131n \u00f6zelli\u011fi&#8221;ni (heap property) korumas\u0131n\u0131 sa\u011flayarak, en y\u00fcksek (veya en d\u00fc\u015f\u00fck) \u00f6ncelikli elemana h\u0131zl\u0131 eri\u015fim imkan\u0131 sunar. Bu makale boyunca, ikili y\u0131\u011f\u0131nlar\u0131n temel prensiplerini, dizi tabanl\u0131 temsilini, temel operasyonlar\u0131n\u0131 ve son olarak JavaScript kullanarak nas\u0131l ad\u0131m ad\u0131m olu\u015fturulaca\u011f\u0131n\u0131 ve bir \u00f6ncelik kuyru\u011fu olarak nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 detayland\u0131raca\u011f\u0131z.<\/p>\n<h3>\u00d6ncelik Kuyruklar\u0131 (Priority Queues)<\/h3>\n<p>\u00d6ncelik kuyru\u011fu, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, elemanlar\u0131n \u00f6nceliklerine g\u00f6re i\u015flendi\u011fi \u00f6zel bir kuyruk t\u00fcr\u00fcd\u00fcr. Normal bir kuyrukta elemanlar giri\u015f s\u0131ras\u0131na g\u00f6re (FIFO) i\u015flenirken, \u00f6ncelik kuyru\u011funda her elemanla ili\u015fkili bir \u00f6ncelik de\u011feri bulunur ve en y\u00fcksek \u00f6ncelikli eleman her zaman ilk olarak \u00e7\u0131kar\u0131l\u0131r. E\u011fer iki eleman\u0131n \u00f6nceli\u011fi e\u015fitse, genellikle giri\u015f s\u0131ras\u0131na g\u00f6re (veya ba\u015fka bir ikincil kritere g\u00f6re) i\u015flenirler.<\/p>\n<h4>Temel Operasyonlar<\/h4>\n<p>Bir \u00f6ncelik kuyru\u011funun tipik olarak destekledi\u011fi operasyonlar \u015funlard\u0131r:<br \/>\n*   <strong><code>enqueue(element, priority)<\/code><\/strong>: Kuyru\u011fa belirli bir \u00f6ncelikle yeni bir eleman ekler.<br \/>\n*   <strong><code>dequeue()<\/code><\/strong>: Kuyruktan en y\u00fcksek \u00f6ncelikli eleman\u0131 \u00e7\u0131kar\u0131r ve d\u00f6nd\u00fcr\u00fcr. (Baz\u0131 implementasyonlarda &#8220;en d\u00fc\u015f\u00fck&#8221; \u00f6ncelikli de olabilir, bu genellikle &#8220;Min-Priority Queue&#8221; veya &#8220;Max-Priority Queue&#8221; olarak adland\u0131r\u0131l\u0131r.)<br \/>\n*   <strong><code>peek()<\/code><\/strong>: Kuyruktaki en y\u00fcksek \u00f6ncelikli elemana bakar, ancak onu kuyruktan \u00e7\u0131karmaz.<br \/>\n*   <strong><code>isEmpty()<\/code><\/strong>: Kuyru\u011fun bo\u015f olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<br \/>\n*   <strong><code>size()<\/code><\/strong>: Kuyruktaki eleman say\u0131s\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr.<\/p>\n<h4>Kullan\u0131m Alanlar\u0131<\/h4>\n<p>\u00d6ncelik kuyruklar\u0131, bilgisayar bilimleri ve yaz\u0131l\u0131m m\u00fchendisli\u011finde \u00e7ok \u00e7e\u015fitli alanlarda kullan\u0131l\u0131r:<br \/>\n*   <strong>\u0130\u015fletim Sistemleri<\/strong>: G\u00f6rev zamanlay\u0131c\u0131lar, hangi s\u00fcrecin bir sonraki \u00e7al\u0131\u015faca\u011f\u0131n\u0131 \u00f6nceli\u011fine g\u00f6re belirler.<br \/>\n*   <strong>A\u011f Algoritmalar\u0131<\/strong>: Dijkstra&#8217;n\u0131n en k\u0131sa yol algoritmas\u0131 ve Prim&#8217;in minimum kapsayan a\u011fa\u00e7 algoritmas\u0131 gibi grafik algoritmalar\u0131, ziyaret edilecek bir sonraki d\u00fc\u011f\u00fcm\u00fc se\u00e7mek i\u00e7in \u00f6ncelik kuyruklar\u0131n\u0131 kullan\u0131r.<br \/>\n*   <strong>Olay Sim\u00fclasyonlar\u0131<\/strong>: Ger\u00e7ek d\u00fcnya olaylar\u0131n\u0131 sim\u00fcle ederken, bir sonraki i\u015flenecek olay\u0131 zaman \u00f6nceli\u011fine g\u00f6re se\u00e7mek i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong>Veri S\u0131k\u0131\u015ft\u0131rma<\/strong>: Huffman kodlama algoritmas\u0131, karakterlerin frekanslar\u0131na g\u00f6re \u00f6nceliklerini belirleyerek bir kod a\u011fac\u0131 olu\u015fturur.<br \/>\n<em>   <strong>Yapay Zeka<\/strong>: A<\/em> arama algoritmas\u0131 gibi en iyi ilk arama algoritmalar\u0131, bir sonraki ke\u015ffedilecek d\u00fc\u011f\u00fcm\u00fc \u00f6nceli\u011fine g\u00f6re se\u00e7mek i\u00e7in \u00f6ncelik kuyruklar\u0131ndan faydalan\u0131r.<\/p>\n<h4>Implementasyon Se\u00e7enekleri ve Neden \u0130kili Y\u0131\u011f\u0131nlar?<\/h4>\n<p>\u00d6ncelik kuyruklar\u0131 \u00e7e\u015fitli \u015fekillerde implemente edilebilir:<br \/>\n*   <strong>S\u0131ral\u0131 Dizi\/Ba\u011fl\u0131 Liste<\/strong>: Elemanlar\u0131 her zaman \u00f6ncelik s\u0131ras\u0131na g\u00f6re tutmak. <code>enqueue<\/code> i\u015flemi O(N) zaman al\u0131r \u00e7\u00fcnk\u00fc do\u011fru konumu bulmak ve eleman\u0131 eklemek i\u00e7in t\u00fcm listenin taranmas\u0131 gerekebilir. <code>dequeue<\/code> ise O(1) zaman al\u0131r \u00e7\u00fcnk\u00fc en y\u00fcksek \u00f6ncelikli eleman her zaman ba\u015ftad\u0131r.<br \/>\n*   <strong>S\u0131ras\u0131z Dizi\/Ba\u011fl\u0131 Liste<\/strong>: Elemanlar\u0131 herhangi bir s\u0131raya g\u00f6re tutmak. <code>enqueue<\/code> i\u015flemi O(1) zaman al\u0131r. Ancak, <code>dequeue<\/code> i\u015flemi O(N) zaman al\u0131r \u00e7\u00fcnk\u00fc en y\u00fcksek \u00f6ncelikli eleman\u0131 bulmak i\u00e7in t\u00fcm listenin taranmas\u0131 gerekir.<\/p>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, bu basit implementasyonlar ya <code>enqueue<\/code> ya da <code>dequeue<\/code> operasyonlar\u0131ndan birini yava\u015flat\u0131r. \u0130deal bir \u00f6ncelik kuyru\u011fu implementasyonu, her iki operasyonu da verimli bir \u015fekilde ger\u00e7ekle\u015ftirmelidir. \u0130\u015fte bu noktada \u0130kili Y\u0131\u011f\u0131nlar devreye girer. \u0130kili y\u0131\u011f\u0131nlar, hem <code>enqueue<\/code> hem de <code>dequeue<\/code> operasyonlar\u0131n\u0131 ortalama O(log N) zaman karma\u015f\u0131kl\u0131\u011f\u0131 ile sunarak, \u00e7o\u011fu senaryo i\u00e7in en iyi performans\u0131 sa\u011flar.<\/p>\n<h3>\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps)<\/h3>\n<p>\u0130kili y\u0131\u011f\u0131n, belirli kurallara uyan \u00f6zel bir tam ikili a\u011fa\u00e7 (complete binary tree) t\u00fcr\u00fcd\u00fcr. Tam ikili a\u011fa\u00e7, son seviye hari\u00e7 t\u00fcm seviyelerin tamamen dolu oldu\u011fu ve son seviyedeki d\u00fc\u011f\u00fcmlerin m\u00fcmk\u00fcn oldu\u011funca solda topland\u0131\u011f\u0131 bir a\u011fa\u00e7t\u0131r. Bu \u00f6zellik, ikili y\u0131\u011f\u0131nlar\u0131n bir dizi (array) kullan\u0131larak verimli bir \u015fekilde temsil edilebilmesini sa\u011flar.<\/p>\n<h4>Y\u0131\u011f\u0131n \u00d6zelli\u011fi (Heap Property)<\/h4>\n<p>\u0130kili y\u0131\u011f\u0131nlar\u0131n en \u00f6nemli \u00f6zelli\u011fi, &#8220;y\u0131\u011f\u0131n \u00f6zelli\u011fi&#8221;dir. Bu \u00f6zellik, y\u0131\u011f\u0131n\u0131n t\u00fcr\u00fcne g\u00f6re de\u011fi\u015fir:<br \/>\n*   <strong>Min-Heap (Minimum Y\u0131\u011f\u0131n)<\/strong>: Her ebeveyn d\u00fc\u011f\u00fcm\u00fcn de\u011feri, \u00e7ocuk d\u00fc\u011f\u00fcmlerinin de\u011ferinden k\u00fc\u00e7\u00fck veya e\u015fit olmal\u0131d\u0131r. Bu, y\u0131\u011f\u0131n\u0131n k\u00f6k\u00fcn\u00fcn her zaman en k\u00fc\u00e7\u00fck de\u011fere sahip olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Max-Heap (Maksimum Y\u0131\u011f\u0131n)<\/strong>: Her ebeveyn d\u00fc\u011f\u00fcm\u00fcn de\u011feri, \u00e7ocuk d\u00fc\u011f\u00fcmlerinin de\u011ferinden b\u00fcy\u00fck veya e\u015fit olmal\u0131d\u0131r. Bu, y\u0131\u011f\u0131n\u0131n k\u00f6k\u00fcn\u00fcn her zaman en b\u00fcy\u00fck de\u011fere sahip olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Bu makalede Min-Heap implementasyonuna odaklanaca\u011f\u0131z, \u00e7\u00fcnk\u00fc genellikle \u00f6ncelik kuyruklar\u0131nda &#8220;en d\u00fc\u015f\u00fck \u00f6ncelikli&#8221; veya &#8220;en erken zamanl\u0131&#8221; elemanlar\u0131 \u00e7\u0131karmak i\u00e7in kullan\u0131l\u0131r. Ancak, mant\u0131k Max-Heap i\u00e7in de olduk\u00e7a benzerdir, sadece kar\u015f\u0131la\u015ft\u0131rma y\u00f6nleri de\u011fi\u015fir.<\/p>\n<h4>Dizi Temsili<\/h4>\n<p>Tam ikili a\u011fa\u00e7 \u00f6zelli\u011fi sayesinde, bir ikili y\u0131\u011f\u0131n bir dizi kullan\u0131larak \u00e7ok verimli bir \u015fekilde temsil edilebilir. A\u011fa\u00e7taki d\u00fc\u011f\u00fcmleri dizinin indekslerine yerle\u015ftiririz ve ebeveyn-\u00e7ocuk ili\u015fkilerini matematiksel form\u00fcllerle hesaplar\u0131z.<br \/>\n*   K\u00f6k d\u00fc\u011f\u00fcm dizinin 0. indeksinde bulunur.<br \/>\n*   Bir d\u00fc\u011f\u00fcm <code>i<\/code> indeksinde ise:<br \/>\n    *   Ebeveyni <code>Math.floor((i - 1) \/ 2)<\/code> indeksindedir.<br \/>\n    <em>   Sol \u00e7ocu\u011fu <code>2 <\/em> i + 1<\/code> indeksindedir.<br \/>\n    <em>   Sa\u011f \u00e7ocu\u011fu <code>2 <\/em> i + 2<\/code> indeksindedir.<\/p>\n<p>Bu temsil, i\u015faret\u00e7i (pointer) y\u00fck\u00fcn\u00fc ortadan kald\u0131r\u0131r ve haf\u0131za a\u00e7\u0131s\u0131ndan olduk\u00e7a verimlidir.<\/p>\n<h4>Temel Operasyonlar<\/h4>\n<p>Bir ikili y\u0131\u011f\u0131n\u0131n temel operasyonlar\u0131 \u015funlard\u0131r:<\/p>\n<p>1.  <strong><code>insert(value)<\/code> (Ekleme)<\/strong>:<br \/>\n    *   Yeni eleman\u0131 dizinin sonuna ekleriz.<br \/>\n    *   Y\u0131\u011f\u0131n \u00f6zelli\u011fini korumak i\u00e7in, yeni eklenen eleman\u0131 ebeveynleriyle kar\u015f\u0131la\u015ft\u0131rarak yukar\u0131 do\u011fru kayd\u0131r\u0131r\u0131z (<code>_bubbleUp<\/code> veya <code>_heapifyUp<\/code>). Bu i\u015flem, eleman do\u011fru yerine oturana veya k\u00f6ke ula\u015fana kadar devam eder.<br \/>\n    *   Karma\u015f\u0131kl\u0131k: O(log N)<\/p>\n<p>2.  <strong><code>extractMin()<\/code> (Minimumu \u00c7\u0131karma &#8211; Min-Heap i\u00e7in)<\/strong>:<br \/>\n    *   Y\u0131\u011f\u0131n\u0131n k\u00f6k\u00fc (en k\u00fc\u00e7\u00fck eleman) her zaman dizinin 0. indeksindedir. Bu eleman\u0131 saklar\u0131z.<br \/>\n    *   Dizinin sonundaki eleman\u0131 k\u00f6ke ta\u015f\u0131r\u0131z ve son eleman\u0131 diziden \u00e7\u0131kar\u0131r\u0131z.<br \/>\n    *   Y\u0131\u011f\u0131n \u00f6zelli\u011fini korumak i\u00e7in, yeni k\u00f6k eleman\u0131 \u00e7ocuklar\u0131yla kar\u015f\u0131la\u015ft\u0131rarak a\u015fa\u011f\u0131 do\u011fru kayd\u0131r\u0131r\u0131z (<code>_sinkDown<\/code> veya <code>_heapifyDown<\/code>). Bu i\u015flem, eleman do\u011fru yerine oturana veya bir yapra\u011fa ula\u015fana kadar devam eder.<br \/>\n    *   Karma\u015f\u0131kl\u0131k: O(log N)<\/p>\n<p>3.  <strong><code>peek()<\/code><\/strong>:<br \/>\n    *   Y\u0131\u011f\u0131n\u0131n k\u00f6k\u00fcndeki eleman\u0131 d\u00f6nd\u00fcr\u00fcr (dizinin 0. indeksindeki eleman).<br \/>\n    *   Karma\u015f\u0131kl\u0131k: O(1)<\/p>\n<p>\u015eimdi bu operasyonlar\u0131 JavaScript ile nas\u0131l implemente edece\u011fimize bakal\u0131m.<\/p>\n<h3>JavaScript ile \u0130kili Y\u0131\u011f\u0131n Uygulamas\u0131 (Min-Heap)<\/h3>\n<p>Bir <code>MinHeap<\/code> s\u0131n\u0131f\u0131 olu\u015fturarak ba\u015flayaca\u011f\u0131z. Bu s\u0131n\u0131f, y\u0131\u011f\u0131n elemanlar\u0131n\u0131 bir JavaScript dizisinde saklayacak ve y\u0131\u011f\u0131n operasyonlar\u0131n\u0131 ger\u00e7ekle\u015ftiren metotlar\u0131 i\u00e7erecektir.<\/p>\n<pre><code class=\"language-javascript\">class MinHeap {\n    constructor() {\n        this.heap = []; \/\/ Y\u0131\u011f\u0131n elemanlar\u0131n\u0131 tutacak dizi\n    }\n\n    \/\/ Y\u0131\u011f\u0131n\u0131n boyutunu d\u00f6nd\u00fcr\u00fcr\n    size() {\n        return this.heap.length;\n    }\n\n    \/\/ Y\u0131\u011f\u0131n\u0131n bo\u015f olup olmad\u0131\u011f\u0131n\u0131 kontrol eder\n    isEmpty() {\n        return this.heap.length === 0;\n    }\n\n    \/\/ Elemanlar\u0131 takas etmek i\u00e7in yard\u0131mc\u0131 metod\n    _swap(idx1, idx2) {\n        [this.heap[idx1], this.heap[idx2]] = [this.heap[idx2], this.heap[idx1]];\n    }\n\n    \/\/ Bir d\u00fc\u011f\u00fcm\u00fcn ebeveyninin indeksini hesaplar\n    _getParentIndex(idx) {\n        return Math.floor((idx - 1) \/ 2);\n    }\n\n    \/\/ Bir d\u00fc\u011f\u00fcm\u00fcn sol \u00e7ocu\u011funun indeksini hesaplar\n    _getLeftChildIndex(idx) {\n        return 2 * idx + 1;\n    }\n\n    \/\/ Bir d\u00fc\u011f\u00fcm\u00fcn sa\u011f \u00e7ocu\u011funun indeksini hesaplar\n    _getRightChildIndex(idx) {\n        return 2 * idx + 2;\n    }\n\n    \/\/ Bir d\u00fc\u011f\u00fcm\u00fcn ebeveynini d\u00f6nd\u00fcr\u00fcr\n    _getParent(idx) {\n        return this.heap[this._getParentIndex(idx)];\n    }\n\n    \/\/ Bir d\u00fc\u011f\u00fcm\u00fcn sol \u00e7ocu\u011funu d\u00f6nd\u00fcr\u00fcr\n    _getLeftChild(idx) {\n        return this.heap[this._getLeftChildIndex(idx)];\n    }\n\n    \/\/ Bir d\u00fc\u011f\u00fcm\u00fcn sa\u011f \u00e7ocu\u011funu d\u00f6nd\u00fcr\u00fcr\n    _getRightChild(idx) {\n        return this.heap[this._getRightChildIndex(idx)];\n    }\n\n    \/\/ Y\u0131\u011f\u0131na yeni bir eleman ekler\n    insert(value) {\n        this.heap.push(value); \/\/ Eleman\u0131 dizinin sonuna ekle\n        this._bubbleUp();     \/\/ Y\u0131\u011f\u0131n \u00f6zelli\u011fini korumak i\u00e7in yukar\u0131 kayd\u0131r\n    }\n\n    \/\/ En k\u00fc\u00e7\u00fck eleman\u0131 \u00e7\u0131kar\u0131r ve d\u00f6nd\u00fcr\u00fcr\n    extractMin() {\n        if (this.isEmpty()) {\n            return null;\n        }\n        if (this.size() === 1) {\n            return this.heap.pop(); \/\/ Tek eleman varsa direkt onu d\u00f6nd\u00fcr\n        }\n\n        const min = this.heap[0]; \/\/ K\u00f6k (en k\u00fc\u00e7\u00fck eleman)\n        this.heap[0] = this.heap.pop(); \/\/ Son eleman\u0131 k\u00f6ke ta\u015f\u0131\n        this._sinkDown();             \/\/ Y\u0131\u011f\u0131n \u00f6zelli\u011fini korumak i\u00e7in a\u015fa\u011f\u0131 kayd\u0131r\n        return min;\n    }\n\n    \/\/ Y\u0131\u011f\u0131n\u0131n en k\u00fc\u00e7\u00fck eleman\u0131na bakar (\u00e7\u0131karmaz)\n    peek() {\n        if (this.isEmpty()) {\n            return null;\n        }\n        return this.heap[0];\n    }\n\n    \/\/ Yeni eklenen eleman\u0131 do\u011fru konumuna ta\u015f\u0131r (yukar\u0131 kayd\u0131r\u0131r)\n    _bubbleUp() {\n        let currentIndex = this.size() - 1; \/\/ Yeni eklenen eleman\u0131n indeksi\n\n        \/\/ Eleman k\u00f6k de\u011filse ve ebeveyninden k\u00fc\u00e7\u00fckse yukar\u0131 kayd\u0131r\n        while (currentIndex > 0 && this.heap[currentIndex] < this._getParent(currentIndex)) {\n            const parentIndex = this._getParentIndex(currentIndex);\n            this._swap(currentIndex, parentIndex);\n            currentIndex = parentIndex; \/\/ \u0130ndeksi ebeveynin indeksine g\u00fcncelle\n        }\n    }\n\n    \/\/ K\u00f6kten sonra yeni k\u00f6k\u00fc do\u011fru konumuna ta\u015f\u0131r (a\u015fa\u011f\u0131 kayd\u0131r\u0131r)\n    _sinkDown() {\n        let currentIndex = 0; \/\/ K\u00f6kten ba\u015fla\n        const length = this.size();\n\n        while (true) {\n            const leftChildIndex = this._getLeftChildIndex(currentIndex);\n            const rightChildIndex = this._getRightChildIndex(currentIndex);\n            let smallestChildIndex = currentIndex; \/\/ Varsay\u0131lan olarak mevcut d\u00fc\u011f\u00fcm en k\u00fc\u00e7\u00fck\n\n            \/\/ Sol \u00e7ocuk varsa ve mevcut d\u00fc\u011f\u00fcmden k\u00fc\u00e7\u00fckse\n            if (leftChildIndex < length &#038;&#038; this.heap[leftChildIndex] < this.heap[smallestChildIndex]) {\n                smallestChildIndex = leftChildIndex;\n            }\n\n            \/\/ Sa\u011f \u00e7ocuk varsa ve (sol \u00e7ocuktan veya mevcut d\u00fc\u011f\u00fcmden) k\u00fc\u00e7\u00fckse\n            if (rightChildIndex < length &#038;&#038; this.heap[rightChildIndex] < this.heap[smallestChildIndex]) {\n                smallestChildIndex = rightChildIndex;\n            }\n\n            \/\/ E\u011fer en k\u00fc\u00e7\u00fck \u00e7ocuk mevcut d\u00fc\u011f\u00fcm\u00fcn kendisi de\u011filse, takas et ve a\u015fa\u011f\u0131 kayd\u0131rmaya devam et\n            if (smallestChildIndex !== currentIndex) {\n                this._swap(currentIndex, smallestChildIndex);\n                currentIndex = smallestChildIndex;\n            } else {\n                \/\/ Mevcut d\u00fc\u011f\u00fcm do\u011fru yerinde, d\u00f6ng\u00fcy\u00fc sonland\u0131r\n                break;\n            }\n        }\n    }\n}<\/code><\/pre>\n<p>Yukar\u0131daki <code>MinHeap<\/code> implementasyonu, say\u0131sal de\u011ferler i\u00e7in \u00e7al\u0131\u015f\u0131r. E\u011fer nesneleri \u00f6nceliklerine g\u00f6re s\u0131ralamak istiyorsak, y\u0131\u011f\u0131n elemanlar\u0131n\u0131 <code>{ value, priority }<\/code> gibi nesneler olarak saklamam\u0131z ve kar\u015f\u0131la\u015ft\u0131rmalar\u0131 <code>priority<\/code> alan\u0131na g\u00f6re yapmam\u0131z gerekir. Bu, bir sonraki b\u00f6l\u00fcmde ele alaca\u011f\u0131m\u0131z <code>PriorityQueue<\/code> s\u0131n\u0131f\u0131n\u0131n temelini olu\u015fturur.<\/p>\n<h3>JavaScript ile \u00d6ncelik Kuyru\u011fu Uygulamas\u0131<\/h3>\n<p>Art\u0131k bir <code>MinHeap<\/code>'imiz oldu\u011funa g\u00f6re, bunu bir <code>PriorityQueue<\/code> olu\u015fturmak i\u00e7in kullanabiliriz. <code>PriorityQueue<\/code>, elemanlar\u0131 ve onlar\u0131n \u00f6nceliklerini y\u00f6neten bir aray\u00fcz sunacak, arka planda ise bu elemanlar\u0131 bir <code>MinHeap<\/code> i\u00e7inde saklayacakt\u0131r.<\/p>\n<p>\u00d6ncelikle, \u00f6ncelik kuyru\u011fumuzda saklayaca\u011f\u0131m\u0131z her eleman i\u00e7in bir <code>Node<\/code> veya <code>Element<\/code> s\u0131n\u0131f\u0131 tan\u0131mlayabiliriz. Bu, eleman\u0131n de\u011ferini ve \u00f6nceli\u011fini bir arada tutmam\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u00d6ncelik kuyru\u011fundaki her eleman i\u00e7in bir s\u0131n\u0131f\nclass PriorityQueueElement {\n    constructor(value, priority) {\n        this.value = value;\n        this.priority = priority;\n    }\n}\n\n\/\/ MinHeap s\u0131n\u0131f\u0131n\u0131 PriorityQueue i\u00e7in \u00f6zelle\u015ftirelim.\n\/\/ Art\u0131k sadece say\u0131lar\u0131 de\u011fil, PriorityQueueElement nesnelerini kar\u015f\u0131la\u015ft\u0131racak.\nclass PriorityMinHeap {\n    constructor() {\n        this.heap = [];\n    }\n\n    size() {\n        return this.heap.length;\n    }\n\n    isEmpty() {\n        return this.heap.length === 0;\n    }\n\n    _swap(idx1, idx2) {\n        [this.heap[idx1], this.heap[idx2]] = [this.heap[idx2], this.heap[idx1]];\n    }\n\n    _getParentIndex(idx) {\n        return Math.floor((idx - 1) \/ 2);\n    }\n\n    _getLeftChildIndex(idx) {\n        return 2 * idx + 1;\n    }\n\n    _getRightChildIndex(idx) {\n        return 2 * idx + 2;\n    }\n\n    _getParent(idx) {\n        return this.heap[this._getParentIndex(idx)];\n    }\n\n    \/\/ Bu metodlarda art\u0131k do\u011frudan de\u011feri de\u011fil, 'priority' \u00f6zelli\u011fini kullanaca\u011f\u0131z.\n    _getLeftChild(idx) {\n        return this.heap[this._getLeftChildIndex(idx)];\n    }\n\n    _getRightChild(idx) {\n        return this.heap[this._getRightChildIndex(idx)];\n    }\n\n    insert(element) { \/\/ element art\u0131k PriorityQueueElement nesnesi\n        this.heap.push(element);\n        this._bubbleUp();\n    }\n\n    extractMin() {\n        if (this.isEmpty()) {\n            return null;\n        }\n        if (this.size() === 1) {\n            return this.heap.pop();\n        }\n\n        const min = this.heap[0];\n        this.heap[0] = this.heap.pop();\n        this._sinkDown();\n        return min;\n    }\n\n    peek() {\n        if (this.isEmpty()) {\n            return null;\n        }\n        return this.heap[0];\n    }\n\n    _bubbleUp() {\n        let currentIndex = this.size() - 1;\n\n        while (currentIndex > 0 && this.heap[currentIndex].priority < this._getParent(currentIndex).priority) {\n            const parentIndex = this._getParentIndex(currentIndex);\n            this._swap(currentIndex, parentIndex);\n            currentIndex = parentIndex;\n        }\n    }\n\n    _sinkDown() {\n        let currentIndex = 0;\n        const length = this.size();\n\n        while (true) {\n            const leftChildIndex = this._getLeftChildIndex(currentIndex);\n            const rightChildIndex = this._getRightChildIndex(currentIndex);\n            let smallestChildIndex = currentIndex;\n\n            \/\/ Sol \u00e7ocuk varsa ve mevcut d\u00fc\u011f\u00fcmden daha d\u00fc\u015f\u00fck \u00f6nceli\u011fe sahipse\n            if (leftChildIndex < length &#038;&#038; this.heap[leftChildIndex].priority < this.heap[smallestChildIndex].priority) {\n                smallestChildIndex = leftChildIndex;\n            }\n\n            \/\/ Sa\u011f \u00e7ocuk varsa ve (sol \u00e7ocuktan veya mevcut d\u00fc\u011f\u00fcmden) daha d\u00fc\u015f\u00fck \u00f6nceli\u011fe sahipse\n            if (rightChildIndex < length &#038;&#038; this.heap[rightChildIndex].priority < this.heap[smallestChildIndex].priority) {\n                smallestChildIndex = rightChildIndex;\n            }\n\n            if (smallestChildIndex !== currentIndex) {\n                this._swap(currentIndex, smallestChildIndex);\n                currentIndex = smallestChildIndex;\n            } else {\n                break;\n            }\n        }\n    }\n}\n\n\/\/ \u00d6ncelik Kuyru\u011fu s\u0131n\u0131f\u0131\nclass PriorityQueue {\n    constructor() {\n        this.minHeap = new PriorityMinHeap(); \/\/ Arka planda MinHeap kullanacak\n    }\n\n    \/\/ Kuyru\u011fa eleman ekler\n    enqueue(value, priority) {\n        const element = new PriorityQueueElement(value, priority);\n        this.minHeap.insert(element);\n    }\n\n    \/\/ En y\u00fcksek \u00f6ncelikli eleman\u0131 (yani en d\u00fc\u015f\u00fck priority de\u011ferine sahip olan\u0131) \u00e7\u0131kar\u0131r\n    dequeue() {\n        const minElement = this.minHeap.extractMin();\n        return minElement ? minElement.value : null; \/\/ Sadece de\u011feri d\u00f6nd\u00fcr\n    }\n\n    \/\/ En y\u00fcksek \u00f6ncelikli elemana bakar\n    peek() {\n        const minElement = this.minHeap.peek();\n        return minElement ? minElement.value : null; \/\/ Sadece de\u011feri d\u00f6nd\u00fcr\n    }\n\n    \/\/ Kuyru\u011fun bo\u015f olup olmad\u0131\u011f\u0131n\u0131 kontrol eder\n    isEmpty() {\n        return this.minHeap.isEmpty();\n    }\n\n    \/\/ Kuyruktaki eleman say\u0131s\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr\n    size() {\n        return this.minHeap.size();\n    }\n}<\/code><\/pre>\n<p>Bu <code>PriorityQueue<\/code> s\u0131n\u0131f\u0131, <code>PriorityMinHeap<\/code>'i kullanarak \u00f6ncelik kuyru\u011fu davran\u0131\u015f\u0131n\u0131 sa\u011flar. <code>enqueue<\/code> metodu, <code>value<\/code> ve <code>priority<\/code> ile bir <code>PriorityQueueElement<\/code> olu\u015fturur ve bunu y\u0131\u011f\u0131na ekler. <code>dequeue<\/code> metodu ise y\u0131\u011f\u0131ndan en d\u00fc\u015f\u00fck \u00f6ncelikli eleman\u0131 (yani <code>minHeap<\/code>'teki k\u00f6k\u00fc) \u00e7\u0131kar\u0131r ve sadece <code>value<\/code> k\u0131sm\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr.<\/p>\n<h3>\u00d6rnek Kullan\u0131m Senaryolar\u0131<\/h3>\n<p>Yukar\u0131daki <code>PriorityQueue<\/code> implementasyonumuzu kullanarak birka\u00e7 senaryoyu canland\u0131ral\u0131m:<\/p>\n<h4>1. G\u00f6rev Zamanlama<\/h4>\n<p>Bir i\u015fletim sisteminde veya bir sunucu uygulamas\u0131nda g\u00f6revleri \u00f6nceliklerine g\u00f6re i\u015flemek i\u00e7in kullan\u0131labilir.<\/p>\n<pre><code class=\"language-javascript\">const taskQueue = new PriorityQueue();\n\ntaskQueue.enqueue(\"Email G\u00f6nder\", 3); \/\/ D\u00fc\u015f\u00fck \u00f6ncelik\ntaskQueue.enqueue(\"Veritaban\u0131 Yedekle\", 1); \/\/ Y\u00fcksek \u00f6ncelik\ntaskQueue.enqueue(\"Kullan\u0131c\u0131 Aray\u00fcz\u00fc G\u00fcncelle\", 2); \/\/ Orta \u00f6ncelik\ntaskQueue.enqueue(\"Sistem Loglar\u0131n\u0131 Temizle\", 4); \/\/ En d\u00fc\u015f\u00fck \u00f6ncelik\ntaskQueue.enqueue(\"Kritik Hata \u0130\u015fle\", 0); \/\/ En y\u00fcksek \u00f6ncelik\n\nconsole.log(\"G\u00f6revler \u00f6ncelik s\u0131ras\u0131na g\u00f6re i\u015fleniyor:\");\nwhile (!taskQueue.isEmpty()) {\n    const nextTask = taskQueue.dequeue();\n    console.log(<code>\u0130\u015fleniyor: ${nextTask}<\/code>);\n}\n\/\/ \u00c7\u0131kt\u0131:\n\/\/ \u0130\u015fleniyor: Kritik Hata \u0130\u015fle\n\/\/ \u0130\u015fleniyor: Veritaban\u0131 Yedekle\n\/\/ \u0130\u015fleniyor: Kullan\u0131c\u0131 Aray\u00fcz\u00fc G\u00fcncelle\n\/\/ \u0130\u015fleniyor: Email G\u00f6nder\n\/\/ \u0130\u015fleniyor: Sistem Loglar\u0131n\u0131 Temizle<\/code><\/pre>\n<h4>2. Olay S\u0131ralama (Sim\u00fclasyonlar i\u00e7in)<\/h4>\n<p>Bir sim\u00fclasyonda, olaylar\u0131n ger\u00e7ekle\u015fme zamanlar\u0131na g\u00f6re s\u0131ralanmas\u0131 gerekebilir. Burada <code>priority<\/code> alan\u0131n\u0131 olay zaman\u0131 olarak kullanabiliriz.<\/p>\n<pre><code class=\"language-javascript\">const eventQueue = new PriorityQueue();\n\neventQueue.enqueue(\"Kullan\u0131c\u0131 A giri\u015fi\", 100);\neventQueue.enqueue(\"Kullan\u0131c\u0131 B \u00e7\u0131k\u0131\u015f\u0131\", 150);\neventQueue.enqueue(\"Sunucu hatas\u0131\", 50); \/\/ Daha erken bir olay\neventQueue.enqueue(\"Veri senkronizasyonu\", 120);\n\nconsole.log(\"\\nOlaylar zaman s\u0131ras\u0131na g\u00f6re i\u015fleniyor:\");\nwhile (!eventQueue.isEmpty()) {\n    const nextEvent = eventQueue.dequeue();\n    console.log(<code>Olay: ${nextEvent}<\/code>);\n}\n\/\/ \u00c7\u0131kt\u0131:\n\/\/ Olay: Sunucu hatas\u0131\n\/\/ Olay: Kullan\u0131c\u0131 A giri\u015fi\n\/\/ Olay: Veri senkronizasyonu\n\/\/ Olay: Kullan\u0131c\u0131 B \u00e7\u0131k\u0131\u015f\u0131<\/code><\/pre>\n<p>Bu \u00f6rnekler, \u00f6ncelik kuyruklar\u0131n\u0131n ger\u00e7ek d\u00fcnya problemlerini \u00e7\u00f6zmek i\u00e7in ne kadar g\u00fc\u00e7l\u00fc ve esnek bir ara\u00e7 oldu\u011funu g\u00f6stermektedir.<\/p>\n<h3>Karma\u015f\u0131kl\u0131k Analizi<\/h3>\n<p>Bir veri yap\u0131s\u0131n\u0131n verimlili\u011fini de\u011ferlendirirken, operasyonlar\u0131n\u0131n zaman ve alan karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 incelemek \u00f6nemlidir. \u0130kili y\u0131\u011f\u0131n tabanl\u0131 bir \u00f6ncelik kuyru\u011fu i\u00e7in karma\u015f\u0131kl\u0131k analizi \u015f\u00f6yledir:<\/p>\n<h4>Zaman Karma\u015f\u0131kl\u0131\u011f\u0131 (Time Complexity)<\/h4>\n<p>*   <strong><code>enqueue(value, priority)<\/code><\/strong>: Yeni bir eleman ekleme i\u015flemi. Eleman dizinin sonuna eklenir ve ard\u0131ndan <code>_bubbleUp<\/code> i\u015flemi ile do\u011fru yerine kayd\u0131r\u0131l\u0131r. Bir eleman\u0131 y\u0131\u011f\u0131nda yukar\u0131 kayd\u0131rmak, y\u0131\u011f\u0131n\u0131n y\u00fcksekli\u011fi kadar ad\u0131m gerektirir. Bir ikili y\u0131\u011f\u0131n\u0131n y\u00fcksekli\u011fi O(log N)'dir (burada N, y\u0131\u011f\u0131ndaki eleman say\u0131s\u0131d\u0131r). Dolay\u0131s\u0131yla, <code>enqueue<\/code> i\u015flemi <strong>O(log N)<\/strong> zaman al\u0131r.<br \/>\n*   <strong><code>dequeue()<\/code><\/strong>: En y\u00fcksek \u00f6ncelikli eleman\u0131 (Min-Heap i\u00e7in en k\u00fc\u00e7\u00fck) \u00e7\u0131karma i\u015flemi. K\u00f6k eleman O(1) zamanda al\u0131n\u0131r. Dizinin son eleman\u0131 k\u00f6ke ta\u015f\u0131n\u0131r ve ard\u0131ndan <code>_sinkDown<\/code> i\u015flemi ile do\u011fru yerine kayd\u0131r\u0131l\u0131r. Bir eleman\u0131 y\u0131\u011f\u0131nda a\u015fa\u011f\u0131 kayd\u0131rmak da y\u0131\u011f\u0131n\u0131n y\u00fcksekli\u011fi kadar ad\u0131m gerektirir. Bu nedenle, <code>dequeue<\/code> i\u015flemi <strong>O(log N)<\/strong> zaman al\u0131r.<br \/>\n*   <strong><code>peek()<\/code><\/strong>: En y\u00fcksek \u00f6ncelikli elemana bakma i\u015flemi. Sadece dizinin ilk eleman\u0131n\u0131 d\u00f6nd\u00fcrmeyi gerektirdi\u011finden, <strong>O(1)<\/strong> zaman al\u0131r.<br \/>\n*   <strong><code>isEmpty()<\/code> \/ <code>size()<\/code><\/strong>: Dizinin uzunlu\u011funu kontrol etmek veya d\u00f6nd\u00fcrmek O(1) zaman al\u0131r.<\/p>\n<p>Bu logaritmik zaman karma\u015f\u0131kl\u0131klar\u0131, y\u0131\u011f\u0131n tabanl\u0131 \u00f6ncelik kuyruklar\u0131n\u0131 b\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken bile olduk\u00e7a verimli k\u0131lar. Di\u011fer basit implementasyonlara k\u0131yasla (dizi tabanl\u0131 s\u0131ral\u0131 veya s\u0131ras\u0131z), y\u0131\u011f\u0131nlar hem ekleme hem de \u00e7\u0131karma i\u015flemlerinde dengeli ve iyi bir performans sunar.<\/p>\n<h4>Alan Karma\u015f\u0131kl\u0131\u011f\u0131 (Space Complexity)<\/h4>\n<p>*   Bir ikili y\u0131\u011f\u0131n, elemanlar\u0131n\u0131 bir dizi i\u00e7inde saklar. Y\u0131\u011f\u0131ndaki N eleman i\u00e7in, dizi de N eleman tutar. Bu nedenle, alan karma\u015f\u0131kl\u0131\u011f\u0131 <strong>O(N)<\/strong>'dir. Bu, i\u015faret\u00e7i tabanl\u0131 a\u011fa\u00e7 yap\u0131lar\u0131na g\u00f6re daha haf\u0131za dostu olabilir \u00e7\u00fcnk\u00fc her d\u00fc\u011f\u00fcm i\u00e7in ek i\u015faret\u00e7i (sol \u00e7ocuk, sa\u011f \u00e7ocuk, ebeveyn) depolama maliyeti yoktur.<\/p>\n<h3>Avantajlar\u0131 ve Dezavantajlar\u0131<\/h3>\n<h4>Avantajlar\u0131<\/h4>\n<p>*   <strong>Verimli Operasyonlar<\/strong>: Hem <code>enqueue<\/code> hem de <code>dequeue<\/code> operasyonlar\u0131 i\u00e7in O(log N) zaman karma\u015f\u0131kl\u0131\u011f\u0131 sunar, bu da b\u00fcy\u00fck veri k\u00fcmeleri i\u00e7in idealdir.<br \/>\n*   <strong>Haf\u0131za Verimlili\u011fi<\/strong>: Dizi tabanl\u0131 implementasyonu sayesinde, i\u015faret\u00e7i y\u00fck\u00fc olmadan kompakt bir bellek kullan\u0131m\u0131 sa\u011flar.<br \/>\n*   <strong>Basit ve Anla\u015f\u0131l\u0131r<\/strong>: Y\u0131\u011f\u0131n yap\u0131s\u0131 ve operasyonlar\u0131 nispeten basit ve anla\u015f\u0131l\u0131rd\u0131r, bu da implementasyon ve hata ay\u0131klamay\u0131 kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Geni\u015f Uygulama Alan\u0131<\/strong>: \u0130\u015fletim sistemleri, a\u011f algoritmalar\u0131, sim\u00fclasyonlar, yapay zeka gibi bir\u00e7ok alanda temel bir yap\u0131 ta\u015f\u0131d\u0131r.<\/p>\n<h4>Dezavantajlar\u0131<\/h4>\n<p>*   <strong>Rastgele Eri\u015fimin Yoklu\u011fu<\/strong>: Y\u0131\u011f\u0131n, s\u0131ral\u0131 bir dizi olmamas\u0131na ra\u011fmen, rastgele bir elemana indeksine g\u00f6re eri\u015fmek O(N) zaman al\u0131r. Sadece k\u00f6k elemana (en y\u00fcksek\/en d\u00fc\u015f\u00fck \u00f6ncelikli) h\u0131zl\u0131 eri\u015fim m\u00fcmk\u00fcnd\u00fcr.<br \/>\n*   <strong><code>delete<\/code> ve <code>update<\/code> \u0130\u015flemlerinin Zorlu\u011fu<\/strong>: Y\u0131\u011f\u0131ndan rastgele bir eleman\u0131 silmek veya bir eleman\u0131n \u00f6nceli\u011fini g\u00fcncellemek, y\u0131\u011f\u0131n \u00f6zelli\u011fini bozabilir. Bu t\u00fcr i\u015flemler genellikle eleman\u0131 bulmay\u0131 (O(N)), silmeyi ve y\u0131\u011f\u0131n\u0131 yeniden d\u00fczenlemeyi (O(log N)) veya t\u00fcm y\u0131\u011f\u0131n\u0131 yeniden in\u015fa etmeyi (O(N)) gerektirir. Bu, y\u0131\u011f\u0131n\u0131n temel g\u00fc\u00e7l\u00fc y\u00f6nlerinden biri de\u011fildir.<br \/>\n*   <strong>Sadece En Y\u00fcksek\/D\u00fc\u015f\u00fck \u00d6ncelikli Eri\u015fimi<\/strong>: Y\u0131\u011f\u0131nlar, sadece en y\u00fcksek veya en d\u00fc\u015f\u00fck \u00f6ncelikli elemana h\u0131zl\u0131 eri\u015fim sa\u011flamak \u00fczere tasarlanm\u0131\u015ft\u0131r. Orta \u00f6ncelikli elemanlar\u0131 bulmak veya \u00e7\u0131karmak verimli de\u011fildir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, veri yap\u0131lar\u0131 d\u00fcnyas\u0131n\u0131n iki \u00f6nemli kavram\u0131 olan \u0130kili Y\u0131\u011f\u0131nlar ve \u00d6ncelik Kuyruklar\u0131n\u0131 detayl\u0131 bir \u015fekilde inceledik. \u00d6ncelik kuyruklar\u0131n\u0131n, elemanlar\u0131 \u00f6nceliklerine g\u00f6re i\u015fleme yetene\u011fi sayesinde bir\u00e7ok ger\u00e7ek d\u00fcnya probleminde vazge\u00e7ilmez bir ara\u00e7 oldu\u011funu g\u00f6rd\u00fck. \u0130kili y\u0131\u011f\u0131nlar\u0131n ise, bu \u00f6ncelik kuyruklar\u0131n\u0131n en verimli ve yayg\u0131n implementasyonlar\u0131ndan biri oldu\u011funu, tam ikili a\u011fa\u00e7 \u00f6zelli\u011fi ve dizi tabanl\u0131 temsil sayesinde O(log N) zaman karma\u015f\u0131kl\u0131\u011f\u0131 ile temel operasyonlar\u0131 ger\u00e7ekle\u015ftirebildi\u011fini \u00f6\u011frendik.<\/p>\n<p>JavaScript ile ad\u0131m ad\u0131m bir <code>MinHeap<\/code> ve bu <code>MinHeap<\/code>'i kullanan bir <code>PriorityQueue<\/code> s\u0131n\u0131f\u0131n\u0131 nas\u0131l olu\u015fturabilece\u011fimizi g\u00f6sterdik. Bu implementasyonlar, JavaScript geli\u015ftiricilerinin modern uygulamalarda performans gerektiren senaryolar\u0131 ele almalar\u0131na olanak tan\u0131r. \u0130ster g\u00f6rev zamanlama, ister a\u011f rotalama, isterse de oyun motorlar\u0131nda olay y\u00f6netimi olsun, ikili y\u0131\u011f\u0131nlar ve \u00f6ncelik kuyruklar\u0131, yaz\u0131l\u0131m m\u00fchendisli\u011fi ara\u00e7 kutunuzda bulunmas\u0131 gereken temel veri yap\u0131lar\u0131d\u0131r.<\/p>\n<p>Bu makalede ele al\u0131nan kavramlar, veri yap\u0131lar\u0131 ve algoritmalar d\u00fcnyas\u0131na bir giri\u015f niteli\u011findedir. Daha karma\u015f\u0131k \u00f6ncelik kuyru\u011fu implementasyonlar\u0131 (\u00f6rne\u011fin Fibonacci Y\u0131\u011f\u0131nlar\u0131 veya Binomial Y\u0131\u011f\u0131nlar\u0131) veya y\u0131\u011f\u0131nlar\u0131n di\u011fer algoritmalarla (\u00f6rne\u011fin Heapsort) entegrasyonu gibi konular, bu temel bilgilerin \u00fczerine in\u015fa edilebilir. Bu temel anlay\u0131\u015f, daha verimli ve \u00f6l\u00e7eklenebilir JavaScript uygulamalar\u0131 geli\u015ftirmenize yard\u0131mc\u0131 olacakt\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile\nGiri\u015f\nBilgisayar bilimlerinde veri yap\u0131lar\u0131 ve algoritm","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[129],"tags":[],"class_list":{"0":"post-32824","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-javascript","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile\" \/>\n<meta property=\"og:description\" content=\"\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile Giri\u015f Bilgisayar bilimlerinde veri yap\u0131lar\u0131 ve algoritm\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-26T06:40:56+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile\",\"datePublished\":\"2025-10-26T06:40:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/\"},\"wordCount\":2474,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Javascript\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/\",\"name\":\"\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-26T06:40:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/","og_locale":"tr_TR","og_type":"article","og_title":"\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile","og_description":"\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile Giri\u015f Bilgisayar bilimlerinde veri yap\u0131lar\u0131 ve algoritm","og_url":"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-26T06:40:56+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile","datePublished":"2025-10-26T06:40:56+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/"},"wordCount":2474,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Javascript"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/","url":"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/","name":"\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-26T06:40:56+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ikili-yiginlar-binary-heaps-ve-oncelik-kuyruklari-priority-queues-javascript-ile\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"\u0130kili Y\u0131\u011f\u0131nlar (Binary Heaps) ve \u00d6ncelik Kuyruklar\u0131 (Priority Queues) JavaScript ile"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32824","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32824"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32824\/revisions"}],"predecessor-version":[{"id":32825,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32824\/revisions\/32825"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32824"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32824"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32824"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}