Tôi muốn lưu trữ chuỗi và phát hành từng chuỗi bằng một số ID duy nhất (chỉ mục sẽ là tốt). Tôi chỉ cần một bản sao của mỗi chuỗi và tôi yêu cầu tra cứu nhanh. Tôi kiểm tra xem chuỗi tồn tại trong bảng thường đủ để tôi nhận thấy hiệu suất đạt được hay không. Whats container tốt nhất để sử dụng cho việc này và làm thế nào để tôi tra cứu nếu chuỗi tồn tại?vùng chứa để tra cứu tên nhanh
Trả lời
Tôi sẽ đề xuất tr1 :: unordered_map. Nó được thực hiện như một hashmap vì vậy nó có độ phức tạp mong đợi của O (1) cho tra cứu và một trường hợp xấu nhất của O (n). Ngoài ra còn có một triển khai tăng cường nếu trình biên dịch của bạn không hỗ trợ tr1.
#include <string>
#include <iostream>
#include <tr1/unordered_map>
using namespace std;
int main()
{
tr1::unordered_map<string, int> table;
table["One"] = 1;
table["Two"] = 2;
cout << "find(\"One\") == " << boolalpha << (table.find("One") != table.end()) << endl;
cout << "find(\"Three\") == " << boolalpha << (table.find("Three") != table.end()) << endl;
return 0;
}
Âm thanh như một mảng sẽ hoạt động tốt khi chỉ mục là chỉ mục vào mảng. Để kiểm tra xem nó có tồn tại không, chỉ cần chắc chắn rằng chỉ mục nằm trong giới hạn của mảng và rằng mục nhập của nó không phải là NULL.
EDIT: nếu bạn sắp xếp danh sách, bạn luôn có thể sử dụng tìm kiếm nhị phân cần có tra cứu nhanh.
EDIT: Ngoài ra, nếu bạn muốn tìm kiếm chuỗi, bạn luôn có thể sử dụng std::map<std::string, int>
. Điều này cần phải có một số tốc độ tra cứu phong nha.
Tôi có một vấn đề hiệu suất với mảng, tôi cần logN –
chờ đợi để bạn muốn có thể nói tồn tại ("my_string")? –
Tôi nghĩ rằng bạn muốn có thể làm: C [index] để lấy chuỗi. –
Thử std :: map.
Các chuỗi có được tìm kiếm có sẵn tĩnh không? Bạn có thể muốn xem một số perfect hashing function
Dễ nhất là sử dụng std :: map.
Nó hoạt động như thế này:
#include <map>
using namespace std;
...
map<string, int> myContainer;
myContainer["foo"] = 5; // map string "foo" to id 5
// Now check if "foo" has been added to the container:
if (myContainer.find("foo") != myContainer.end())
{
// Yes!
cout << "The ID of foo is " << myContainer["foo"];
}
// Let's get "foo" out of it
myContainer.erase("foo")
Như tôi đã nhận xét về câu trả lời của @ Teran: Nó sẽ không là
ông nói rằng ông muốn tra cứu bằng một chuỗi trong bình luận để terans trả lời nếu tôi có anh ta ngay –
cũng ông didnt ... nhưng chúng tôi đoán ông đã làm :) –
Trước hết bạn phải có khả năng lượng lựa chọn của bạn. Bạn cũng đã cho chúng tôi biết rằng mẫu sử dụng chính mà bạn quan tâm là tìm kiếm tra cứu, không chèn.
Hãy N
là số dây mà bạn mong đợi để được có trong bảng, và để C
là số trung bình của các nhân vật trong bất kỳ chuỗi được hiện diện trong bảng cho biết (hoặc trong chuỗi được kiểm tra chống lại bàn).
Trong trường hợp của một băm dựa trên cách tiếp cận, đối với mỗi tra cứu bạn phải trả các chi phí sau:
O(C)
- tính toán hash cho chuỗi bạn đang về để tìm kiếm- giữa
O(1 x C)
vàO(N x C)
, trong đó1..N
là chi phí bạn mong đợi khi duyệt qua nhóm dựa trên khóa băm, tại đây nhân vớiC
để kiểm tra lại các ký tự trong mỗi chuỗi so với tra cứu chủ chốt - tổng thời gian: giữa
O(2 x C)
vàO((N + 1) x C)
Trong trường hợp của một
std::map
cách tiếp cận dựa trên (trong đó sử dụng cây đỏ-đen), với mỗi lookup bạn trả chi phí sau:- tổng thời gian: giữa
O(1 x C)
vàO(log(N) x C)
- nơiO(log(N))
là chi phí cây traversal tối đa, vàO(C)
là thời gian mà 0 genericless<>
thực hiện's cần thiết để kiểm tra lại chìa khóa tra cứu của bạn trong cây traversal
- tổng thời gian: giữa
Trong trường hợp giá trị lớn cho N
và trong sự vắng mặt của một hàm băm mà đảm bảo ít hơn log (N) va chạm, hoặc nếu bạn chỉ muốn chơi nó an toàn, bạn nên sử dụng phương pháp dựa trên cây (std::map
). Nếu N là nhỏ, bằng mọi cách, sử dụng một cách tiếp cận băm dựa trên (. Trong khi vẫn đảm bảo rằng băm va chạm là thấp)
Trước khi thực hiện bất kỳ quyết định, tuy nhiên, bạn cũng nên kiểm tra:
thử điều này:
- 1. tra cứu tên đường dẫn trong Linux?
- 2. Cách tìm tên JJI tra cứu EJB theo chương trình?
- 3. Tra cứu nhanh Danh sách <T>
- 4. Vùng chứa C++ nhanh nhất: Giá trị duy nhất
- 5. tra cứu tên bảng trong PSQL
- 6. Tra cứu tên trong các mẫu C++
- 7. Làm rõ về tra cứu tên C++
- 8. Tra cứu tên máy chủ từ Maven
- 9. Liệt kê tên vùng chứa của tên mạnh CSP
- 10. getattr() so với tra cứu dict, nhanh hơn?
- 11. Chức năng tra cứu bảng tra cứu từ k & r
- 12. Làm cách nào để sao chép và đổi tên vùng chứa Docker?
- 13. Tra cứu bảng Lua
- 14. Tìm phân đoạn theo tên thẻ trong vùng chứa
- 15. Vùng chứa IoC và Thiết kế Điều khiển Tên miền
- 16. Tại sao phạm vi tham số C++ ảnh hưởng đến chức năng tra cứu trong một vùng tên?
- 17. Vùng chứa ActiveX là gì?
- 18. Thuật toán nào các máy chủ DNS sử dụng để tra cứu nhanh hơn?
- 19. Phím chuỗi được băm trước để tra cứu từ điển Python nhanh hơn?
- 20. Cách nhanh hơn để tra cứu giá trị trong danh sách bộ dữ liệu là gì?
- 21. Tra cứu ngược C++
- 22. Cấu trúc dữ liệu cho khoảng thời gian nhanh chóng tra cứu
- 23. Tra cứu Quadtree
- 24. tra cứu trong c
- 25. Bảng tra cứu để giải mã oracle?
- 26. Lý do để tra cứu Koenig
- 27. Tra cứu mã vùng điện thoại theo vĩ độ và kinh độ
- 28. Bản đồ băm được tối ưu hóa để tra cứu
- 29. Fragment.onCreateView có vùng chứa rỗng
- 30. Hiệu suất vùng chứa PPL
Không sử dụng unordered_map trong T1, nó không có phương pháp dự trữ và nếu bạn chèn nhiều chuỗi trong giai đoạn chèn, bạn sẽ có nhiều lần khôi phục. –
Cũng unordered_map cho chuỗi dài là tồi tệ hơn một std :: bản đồ –