Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menangani perlanggaran cincang apabila menggunakan C++ STL?

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

WBOY
WBOYasal
2024-06-01 11:06:56672semak imbas

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;
}

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;
}

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;
}

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!

Kenyataan:
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