Bagaimana untuk menangani perlanggaran cincang apabila menggunakan C++ STL?

WBOY
Lepaskan: 2024-06-01 11:06:56
asal
671 orang telah melayarinya

Konflik cincang C++ STL dikendalikan dengan cara berikut: Kaedah alamat rantai: Gunakan senarai terpaut untuk menyimpan elemen bercanggah, yang mempunyai kebolehgunaan yang baik. Kaedah pengalamatan terbuka: Cari lokasi yang tersedia dalam baldi untuk menyimpan elemen Sub-kaedah ialah: Pengesanan linear: Cari lokasi tersedia seterusnya dalam urutan. Pengesanan Kuadratik: Cari dengan melangkau kedudukan dalam bentuk kuadratik.

使用 C++ STL 时如何处理哈希冲突?

Cara mengendalikan perlanggaran cincang dalam C++ STL

Apabila menggunakan jadual cincang Perpustakaan Templat Standard (STL) C++, perlanggaran tidak dapat dielakkan kerana berbilang kunci boleh dicincang pada baldi yang sama. Untuk mengendalikan konflik, STL menyediakan kaedah berikut:

Kaedah alamat rantaian

Kaedah alamat rantaian menggunakan senarai terpaut untuk menyimpan elemen yang dicincang ke dalam baldi yang sama. Apabila konflik berlaku, nod senarai terpaut baharu dibuat dan elemen itu ditambahkan pada senarai terpaut. Ini ialah kaedah pengendalian perlanggaran yang paling biasa digunakan kerana ia mengendalikan jadual cincang padat dengan baik.

#include <unordered_map>
#include <list>

int main() {
  std::unordered_map<int, std::list<int>> hash_table;
  hash_table[10].push_back(100);
  hash_table[10].push_back(200);

  // 迭代哈希到 10 的键
  for (auto& item : hash_table[10]) {
    std::cout << item << " ";  // 输出 100 200
  }
  return 0;
}
Salin selepas log masuk

Kaedah pengalamatan terbuka

Kaedah pengalamatan terbuka tidak akan mencipta nod baharu apabila konflik berlaku. Sebaliknya, ia mencari lokasi yang tersedia seterusnya dalam baldi untuk menyimpan elemen. Terdapat beberapa kaedah pengalamatan terbuka, yang paling biasa ialah probing linear dan probing kuadratik.

Penyelidikan linear:

#include <unordered_map>

int main() {
  std::unordered_map<int, int> hash_table;
  hash_table[10] = 100;  // 插入 (10, 100)
  hash_table[10] = 200;  // 更新 (10, 200)

  // 访问更新后的值
  std::cout << hash_table[10] << std::endl;  // 输出 200
  return 0;
}
Salin selepas log masuk

Penyelidikan kuadratik:

#include <unordered_map>

int main() {
  std::unordered_map<int, int, std::hash<int>, std::equal_to<int>, QuadraticProbing<int, int>> hash_table;
  hash_table[10] = 100;  // 插入 (10, 100)
  hash_table[10] = 200;  // 更新 (10, 200)

  // 访问更新后的值
  std::cout << hash_table[10] << std::endl;  // 输出 200
  return 0;
}
Salin selepas log masuk

Kaedah pengendalian perlanggaran yang dipilih bergantung pada jangkaan faktor beban jadual cincang. Kaedah pengalamatan rantaian secara amnya lebih sesuai untuk jadual cincang padat, manakala kaedah pengalamatan terbuka lebih sesuai untuk jadual cincang yang jarang.

Atas ialah kandungan terperinci Bagaimana untuk menangani perlanggaran cincang apabila menggunakan C++ STL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan