Rumah hujung hadapan web tutorial js Penjelasan grafik terperinci tentang algoritma pengisihan timbunan Timbunan dan pelaksanaan kod JavaScript_Pengetahuan asas

Penjelasan grafik terperinci tentang algoritma pengisihan timbunan Timbunan dan pelaksanaan kod JavaScript_Pengetahuan asas

May 16, 2016 pm 03:02 PM
javascript js Isih timbunan Algoritma isihan timbunan algoritma pengisihan

1. Saya perlu bercakap tentang pokok binari
Untuk memahami timbunan, anda mesti terlebih dahulu memahami pokok binari Dalam sains komputer, pokok binari ialah struktur pokok di mana setiap nod mempunyai paling banyak dua subpokok. Biasanya subtree dipanggil "subtree kiri" dan "subtree kanan". Pokok binari sering digunakan untuk melaksanakan pokok carian binari dan timbunan binari.
Setiap nod pokok binari mempunyai paling banyak dua subpokok (tiada nod dengan darjah lebih daripada 2 Subpokok pokok binari dibahagikan kepada subpokok kiri dan kanan, dan susunannya tidak boleh diterbalikkan. Tahap ke-i bagi pokok binari mempunyai paling banyak 2i - 1 nod; pokok binari dengan kedalaman k mempunyai paling banyak 2k - 1 nod untuk mana-mana pokok binari T, jika bilangan nod terminal ialah n0, bilangan nod dengan darjah 2 ialah n2, maka n0 = n2 + 1.
Tiga perbezaan utama antara pokok dan pokok binari:
Bilangan nod pokok mestilah sekurang-kurangnya 1, manakala bilangan nod pokok binari boleh 0
Tiada had kepada darjah maksimum nod dalam pokok, manakala darjah maksimum nod dalam pokok binari ialah 2
Nod pokok tidak dibahagikan kepada kiri dan kanan, manakala nod pokok binari dibahagikan kepada kiri dan kanan
Pokok binari dibahagikan kepada pokok binari lengkap dan pokok binari penuh
Pokok binari penuh: Pokok dengan kedalaman k dan 2k - 1 nod dipanggil pokok binari penuh

201654180037749.png (325×199)

(pokok binari penuh dengan kedalaman 3)
Pokok binari lengkap: Pokok binari dengan kedalaman k dan n nod Jika dan hanya jika setiap nodnya sepadan dengan nod bernombor 1 hingga n dalam pokok binari penuh dengan kedalaman k, ia dipanggil pokok binari lengkap

201654180205013.png (298×198)

(pokok binari lengkap dengan kedalaman 3)
2. Apakah timbunan?
Timbunan (timbunan binari) boleh dianggap sebagai pokok binari yang lengkap Sifat "cemerlang" bagi pokok binari yang lengkap ialah setiap tahap kecuali tahap terendah adalah penuh, yang membolehkan timbunan menggunakan tatasusunan untuk Diwakili (biasa. pokok binari biasanya diwakili oleh senarai terpaut sebagai bekas asas), setiap nod sepadan dengan elemen dalam tatasusunan.
Seperti yang ditunjukkan di bawah, ini ialah hubungan antara timbunan dan tatasusunan

201654180403849.png (564×182)

(Saling hubungan antara timbunan dan tatasusunan)
Untuk subskrip i nod tertentu, subskrip nod induk dan nod anak nod ini boleh dikira dengan mudah:
Induk(i) = lantai(i/2), subskrip nod induk i
Kiri(i) = 2i, subskrip nod anak kiri i
Kanan(i) = 2i + 1, subskrip nod anak kanan i

201654180531505.png (549×172)

Timbunan binari biasanya dibahagikan kepada dua jenis: timbunan maksimum dan timbunan minimum.
Timbunan maksimum:
Nilai elemen maksimum dalam timbunan maks muncul pada nod akar (atas timbunan)
Nilai elemen setiap nod induk dalam timbunan adalah lebih besar daripada atau sama dengan nod anaknya (jika wujud)

201654180552874.png (373×112)

(timbunan maksimum)
Timbunan minimum:
Nilai elemen terkecil dalam timbunan min muncul pada nod akar (bahagian atas timbunan)
Nilai elemen setiap nod induk dalam timbunan adalah kurang daripada atau sama dengan nod anaknya (jika wujud)

201654180607921.png (370×112)

(timbunan min)
3. Prinsip pengisihan timbunan
Isih timbunan adalah untuk mengeluarkan nombor maksimum di bahagian atas timbunan maksimum, terus melaraskan timbunan yang tinggal kepada timbunan maksimum, dan mengeluarkan nombor maksimum di bahagian atas timbunan lagi Proses ini berterusan sehingga ke sana hanya tinggal satu nombor sahaja. Takrifkan operasi berikut pada timbunan:
Max-Heapify: Laraskan nod anak akhir timbunan supaya nod anak sentiasa lebih kecil daripada nod induk
Buat timbunan maksimum (Build-Max-Heap): Susun semula semua data dalam timbunan untuk menjadikannya timbunan maksimum
Isih Timbunan: Alih keluar nod akar data pertama dan lakukan operasi rekursif pelarasan timbunan maksimum
Sebelum meneruskan perbincangan berikut, satu perkara yang perlu diberi perhatian ialah tatasusunan semuanya Berasaskan Sifar, yang bermaksud model struktur data timbunan kami akan berubah

201654180627211.png (562×194)

(Berasaskan Sifar)
Sejajar dengan itu, beberapa formula pengiraan juga mesti dilaraskan dengan sewajarnya:
Induk(i) = lantai((i-1)/2), subskrip nod induk i
Kiri(i) = 2i + 1, subskrip nod anak kiri i
Kanan(i) = 2(i + 1), subskrip nod anak kanan i
Fungsi pelarasan timbunan maksimum (MAX-HEAPIFY) adalah untuk mengekalkan sifat timbunan maksimum dan merupakan subrutin teras untuk mencipta timbunan maksimum Proses fungsi adalah seperti yang ditunjukkan dalam rajah:

201654180644675.png (564×411)

(Max-Heapify)
Memandangkan selepas satu pelarasan, timbunan masih melanggar sifat timbunan, ujian rekursif diperlukan untuk menjadikan keseluruhan timbunan memenuhi sifat timbunan Ini boleh dinyatakan dalam JavaScript seperti berikut:

/**
 * 从 index 开始检查并保持最大堆性质
 *
 * @array
 *
 * @index 检查的起始下标
 *
 * @heapSize 堆大小
 *
 **/
function maxHeapify(array, index, heapSize) {
 var iMax = index,
   iLeft = 2 * index + 1,
   iRight = 2 * (index + 1);

 if (iLeft < heapSize && array[index] < array[iLeft]) {
  iMax = iLeft;
 }

 if (iRight < heapSize && array[iMax] < array[iRight]) {
  iMax = iRight;
 }

 if (iMax != index) {
  swap(array, iMax, index);
  maxHeapify(array, iMax, heapSize); // 递归调整
 }
}

function swap(array, i, j) {
 var temp = array[i];
 array[i] = array[j];
 array[j] = temp;
}

Salin selepas log masuk

Secara umumnya, rekursi digunakan terutamanya dalam kaedah bahagi dan takluk, tetapi bahagi dan takluk tidak diperlukan di sini. Selain itu, panggilan rekursif memerlukan menolak/mengosongkan timbunan, yang mempunyai sedikit kelemahan prestasi berbanding dengan lelaran. Sudah tentu, mengikut peraturan 20/80, ini boleh diabaikan. Tetapi jika anda merasakan bahawa menggunakan rekursi akan membuat anda berasa tidak selesa, anda juga boleh menggunakan lelaran, seperti berikut:

/**
 * 从 index 开始检查并保持最大堆性质
 *
 * @array
 *
 * @index 检查的起始下标
 *
 * @heapSize 堆大小
 *
 **/
function maxHeapify(array, index, heapSize) {
 var iMax, iLeft, iRight;
 while (true) {
  iMax = index;
  iLeft = 2 * index + 1;
  iRight = 2 * (index + 1);
  if (iLeft < heapSize && array[index] < array[iLeft]) {
   iMax = iLeft;
  }

  if (iRight < heapSize && array[iMax] < array[iRight]) {
   iMax = iRight;
  }

  if (iMax != index) {
   swap(array, iMax, index);
   index = iMax;
  } else {
   break;
  }
 }
}

function swap(array, i, j) {
 var temp = array[i];
 array[i] = array[j];
 array[j] = temp;
}

Salin selepas log masuk

Fungsi mencipta timbunan maksimum (Build-Max-Heap) adalah untuk mengubah tatasusunan menjadi timbunan maksimum. Ia menerima dua parameter: susunan dan saiz timbunan akan memanggil Max-Heapify atas. Ubah tatasusunan dan buat timbunan maksimum. Oleh kerana Max-Heapify boleh memastikan bahawa nod selepas nod dengan subskrip i memenuhi sifat timbunan maksimum, panggilan bawah ke atas Max-Heapify boleh mengekalkan sifat ini semasa proses transformasi. Jika bilangan elemen dalam timbunan maksimum ialah n, maka Build-Max-Heap bermula dari Parent(n) dan memanggil Max-Heapify dalam urutan. Prosesnya adalah seperti berikut:

201654180758506.jpg (614×673)

Diterangkan dalam JavaScript seperti berikut:

function buildMaxHeap(array, heapSize) {
 var i,
   iParent = Math.floor((heapSize - 1) / 2);
   
 for (i = iParent; i >= 0; i--) {
  maxHeapify(array, i, heapSize);
 }
}
Salin selepas log masuk

Isih Timbunan ialah algoritma antara muka isihan Timbunan terlebih dahulu memanggil Build-Max-Heap untuk mengubah tatasusunan menjadi timbunan maksimum, kemudian menukar elemen atas dan bawah timbunan, kemudian menaikkan bahagian bawah, dan akhirnya Recall Max-Heapify untuk mengekalkan sifat timbunan maksimum. Memandangkan elemen atas timbunan mestilah elemen terbesar dalam timbunan, selepas satu operasi, unsur terbesar yang wujud dalam timbunan dipisahkan daripada timbunan Selepas mengulangi n-1 kali, tatasusunan disusun. Seluruh proses adalah seperti berikut:

201654180823776.jpg (604×926)

Diterangkan dalam JavaScript seperti berikut:

function heapSort(array, heapSize) {

 buildMaxHeap(array, heapSize);

 for (int i = heapSize - 1; i > 0; i--) {
  swap(array, 0, i);
  maxHeapify(array, 0, i);
 } 
}

Salin selepas log masuk

4.Pelaksanaan bahasa JavaScript
Akhir sekali, susun perkara di atas ke dalam kod javascript lengkap seperti berikut:

function heapSort(array) {

 function swap(array, i, j) {
  var temp = array[i];
  array[i] = array[j];
  array[j] = temp;
 }

 function maxHeapify(array, index, heapSize) {
  var iMax,
   iLeft,
   iRight;
  while (true) {
   iMax = index;
   iLeft = 2 * index + 1;
   iRight = 2 * (index + 1);

   if (iLeft < heapSize && array[index] < array[iLeft]) {
    iMax = iLeft;
   }

   if (iRight < heapSize && array[iMax] < array[iRight]) {
    iMax = iRight;
   }

   if (iMax != index) {
    swap(array, iMax, index);
    index = iMax;
   } else {
    break;
   }
  }
 }

 function buildMaxHeap(array) {
  var i,
   iParent = Math.floor(array.length / 2) - 1;

  for (i = iParent; i >= 0; i--) {
   maxHeapify(array, i, array.length);
  }
 }

 function sort(array) {
  buildMaxHeap(array);

  for (var i = array.length - 1; i > 0; i--) {
   swap(array, 0, i);
   maxHeapify(array, 0, i);
  }
  return array;
 }

 return sort(array);
}

Salin selepas log masuk

5. Aplikasi algoritma isihan timbunan

(1) Prestasi/kerumitan algoritma
Kerumitan masa bagi jenis timbunan adalah sangat stabil (kita dapat melihat bahawa ia tidak sensitif kepada data input), ia adalah kerumitan O(n㏒n), dan kes terbaik adalah sama dengan kes terburuk.
Walau bagaimanapun, kerumitan ruangnya berbeza dari pelaksanaan ke pelaksanaan. Dua kerumitan biasa telah dibincangkan di atas: O(n) dan O(1). Selaras dengan prinsip penjimatan ruang, saya mengesyorkan kaedah kerumitan O(1).

(2) Kestabilan algoritma
Isihan timbunan melibatkan sebilangan besar proses penyaringan dan pergerakan serta merupakan algoritma pengisihan yang tidak stabil.

(3) Algoritma senario terpakai
Isih timbunan akan menyebabkan overhed yang agak besar dalam proses penubuhan dan pelarasan timbunan, dan tidak sesuai apabila terdapat sedikit elemen. Walau bagaimanapun, ia masih merupakan pilihan yang baik apabila terdapat banyak elemen. Terutama apabila menyelesaikan masalah seperti "nombor pertama n terbesar", ia hampir menjadi algoritma pilihan.

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk melaksanakan sistem pengecaman pertuturan dalam talian menggunakan WebSocket dan JavaScript Bagaimana untuk melaksanakan sistem pengecaman pertuturan dalam talian menggunakan WebSocket dan JavaScript Dec 17, 2023 pm 02:54 PM

Cara menggunakan WebSocket dan JavaScript untuk melaksanakan sistem pengecaman pertuturan dalam talian Pengenalan: Dengan perkembangan teknologi yang berterusan, teknologi pengecaman pertuturan telah menjadi bahagian penting dalam bidang kecerdasan buatan. Sistem pengecaman pertuturan dalam talian berdasarkan WebSocket dan JavaScript mempunyai ciri kependaman rendah, masa nyata dan platform merentas, dan telah menjadi penyelesaian yang digunakan secara meluas. Artikel ini akan memperkenalkan cara menggunakan WebSocket dan JavaScript untuk melaksanakan sistem pengecaman pertuturan dalam talian.

Disyorkan: Projek pengesanan dan pengecaman muka sumber terbuka JS yang sangat baik Disyorkan: Projek pengesanan dan pengecaman muka sumber terbuka JS yang sangat baik Apr 03, 2024 am 11:55 AM

Teknologi pengesanan dan pengecaman muka adalah teknologi yang agak matang dan digunakan secara meluas. Pada masa ini, bahasa aplikasi Internet yang paling banyak digunakan ialah JS Melaksanakan pengesanan muka dan pengecaman pada bahagian hadapan Web mempunyai kelebihan dan kekurangan berbanding dengan pengecaman muka bahagian belakang. Kelebihan termasuk mengurangkan interaksi rangkaian dan pengecaman masa nyata, yang sangat memendekkan masa menunggu pengguna dan meningkatkan pengalaman pengguna termasuk: terhad oleh saiz model, ketepatannya juga terhad. Bagaimana untuk menggunakan js untuk melaksanakan pengesanan muka di web? Untuk melaksanakan pengecaman muka di Web, anda perlu biasa dengan bahasa dan teknologi pengaturcaraan yang berkaitan, seperti JavaScript, HTML, CSS, WebRTC, dll. Pada masa yang sama, anda juga perlu menguasai visi komputer yang berkaitan dan teknologi kecerdasan buatan. Perlu diingat bahawa kerana reka bentuk bahagian Web

Alat penting untuk analisis saham: Ketahui langkah-langkah untuk melukis carta lilin dengan PHP dan JS Alat penting untuk analisis saham: Ketahui langkah-langkah untuk melukis carta lilin dengan PHP dan JS Dec 17, 2023 pm 06:55 PM

Alat penting untuk analisis saham: Pelajari langkah-langkah untuk melukis carta lilin dalam PHP dan JS, contoh kod khusus diperlukan Dengan perkembangan pesat Internet dan teknologi, perdagangan saham telah menjadi salah satu cara penting bagi banyak pelabur. Analisis saham adalah bahagian penting dalam membuat keputusan pelabur, dan carta lilin digunakan secara meluas dalam analisis teknikal. Mempelajari cara melukis carta lilin menggunakan PHP dan JS akan memberikan pelabur maklumat yang lebih intuitif untuk membantu mereka membuat keputusan yang lebih baik. Carta candlestick ialah carta teknikal yang memaparkan harga saham dalam bentuk candlestick. Ia menunjukkan harga saham

WebSocket dan JavaScript: teknologi utama untuk melaksanakan sistem pemantauan masa nyata WebSocket dan JavaScript: teknologi utama untuk melaksanakan sistem pemantauan masa nyata Dec 17, 2023 pm 05:30 PM

WebSocket dan JavaScript: Teknologi utama untuk merealisasikan sistem pemantauan masa nyata Pengenalan: Dengan perkembangan pesat teknologi Internet, sistem pemantauan masa nyata telah digunakan secara meluas dalam pelbagai bidang. Salah satu teknologi utama untuk mencapai pemantauan masa nyata ialah gabungan WebSocket dan JavaScript. Artikel ini akan memperkenalkan aplikasi WebSocket dan JavaScript dalam sistem pemantauan masa nyata, memberikan contoh kod dan menerangkan prinsip pelaksanaannya secara terperinci. 1. Teknologi WebSocket

Cara menggunakan JavaScript dan WebSocket untuk melaksanakan sistem pesanan dalam talian masa nyata Cara menggunakan JavaScript dan WebSocket untuk melaksanakan sistem pesanan dalam talian masa nyata Dec 17, 2023 pm 12:09 PM

Pengenalan kepada cara menggunakan JavaScript dan WebSocket untuk melaksanakan sistem pesanan dalam talian masa nyata: Dengan populariti Internet dan kemajuan teknologi, semakin banyak restoran telah mula menyediakan perkhidmatan pesanan dalam talian. Untuk melaksanakan sistem pesanan dalam talian masa nyata, kami boleh menggunakan teknologi JavaScript dan WebSocket. WebSocket ialah protokol komunikasi dupleks penuh berdasarkan protokol TCP, yang boleh merealisasikan komunikasi dua hala masa nyata antara pelanggan dan pelayan. Dalam sistem pesanan dalam talian masa nyata, apabila pengguna memilih hidangan dan membuat pesanan

Petua Pembangunan PHP dan JS: Kuasai Kaedah Melukis Carta Lilin Stok Petua Pembangunan PHP dan JS: Kuasai Kaedah Melukis Carta Lilin Stok Dec 18, 2023 pm 03:39 PM

Dengan perkembangan pesat kewangan Internet, pelaburan saham telah menjadi pilihan semakin ramai orang. Dalam perdagangan saham, carta lilin adalah kaedah analisis teknikal yang biasa digunakan Ia boleh menunjukkan trend perubahan harga saham dan membantu pelabur membuat keputusan yang lebih tepat. Artikel ini akan memperkenalkan kemahiran pembangunan PHP dan JS, membawa pembaca memahami cara melukis carta lilin saham dan menyediakan contoh kod khusus. 1. Memahami Carta Lilin Saham Sebelum memperkenalkan cara melukis carta lilin saham, kita perlu memahami dahulu apa itu carta lilin. Carta candlestick telah dibangunkan oleh orang Jepun

JavaScript dan WebSocket: Membina sistem ramalan cuaca masa nyata yang cekap JavaScript dan WebSocket: Membina sistem ramalan cuaca masa nyata yang cekap Dec 17, 2023 pm 05:13 PM

JavaScript dan WebSocket: Membina sistem ramalan cuaca masa nyata yang cekap Pengenalan: Hari ini, ketepatan ramalan cuaca sangat penting kepada kehidupan harian dan membuat keputusan. Apabila teknologi berkembang, kami boleh menyediakan ramalan cuaca yang lebih tepat dan boleh dipercayai dengan mendapatkan data cuaca dalam masa nyata. Dalam artikel ini, kita akan mempelajari cara menggunakan teknologi JavaScript dan WebSocket untuk membina sistem ramalan cuaca masa nyata yang cekap. Artikel ini akan menunjukkan proses pelaksanaan melalui contoh kod tertentu. Kami

Tutorial JavaScript Mudah: Cara Mendapatkan Kod Status HTTP Tutorial JavaScript Mudah: Cara Mendapatkan Kod Status HTTP Jan 05, 2024 pm 06:08 PM

Tutorial JavaScript: Bagaimana untuk mendapatkan kod status HTTP, contoh kod khusus diperlukan: Dalam pembangunan web, interaksi data dengan pelayan sering terlibat. Apabila berkomunikasi dengan pelayan, kami selalunya perlu mendapatkan kod status HTTP yang dikembalikan untuk menentukan sama ada operasi itu berjaya dan melaksanakan pemprosesan yang sepadan berdasarkan kod status yang berbeza. Artikel ini akan mengajar anda cara menggunakan JavaScript untuk mendapatkan kod status HTTP dan menyediakan beberapa contoh kod praktikal. Menggunakan XMLHttpRequest

See all articles