面試官可能一直在尋找這樣的認識......
- 一個哈希表是一個低級別的概念,並不暗示或一定支持任何區分或隔離鍵和值(即可以實現散列設定使用散列表)的值,而
- 一個哈希映射必須支持不同的鍵和值,作爲有可從鍵到值的映射/關聯;兩者是不同的,即使在一些實現中它們總是並排存儲在存儲器中,例如,相同結構的成員/
std::pair<>
。
實例:(壞)哈希表實現防止用作哈希映射。
考慮:
template <typename T>
class Hash_Table
{
...
bool insert(const T& t)
{
// work out which bucket t hashes to...
size_t bucket = hash_bytes((void*)&t, sizeof t) % num_buckets_;
// see if t is already stored in the bucket...
if (memcmp((void*)&t, (void*)&buckets_[bucket], sizeof t) == 0)
...
... handle collisions etc. ...
}
...
};
以上,硬編碼調用的是把插入爲二進制的blob值的散列函數,以及整個t
的memcmp
,意味着你不能做T
說一個std::pair<int, std::string>
並且使用散列表作爲從int
s到string
s的散列圖。所以,這是一個散列表的例子,其而不是可用作散列映射。
您可能會或可能不會還要考慮一個哈希表,根本沒有用作哈希表不是一個哈希表提供任何便利功能。例如,如果API被設計爲就好像只處理值 - h.insert(t); h.erase(t); auto i = h.find(t);
- 但它允許調用者指定任意自定義比較和散列函數,這些函數可能會將其操作僅限於t
的關鍵部分,那麼散列表可能會將(ab)用作功能哈希映射。
爲了闡明如何涉及makadev現有答案,我不同意:
「A哈希表[用途]鍵散列來查找對應的值」;因爲它假設一個鍵 - >值映射。
「一個HashMap [...]。映射是抽象的,它可能不是一個表,平衡樹或嘗試或其他數據結構/映射也是可能的。錯誤,因爲哈希映射的主要機制仍然是對錶/數組中桶(索引)的哈希:某些哈希表/映射可能使用其他數據結構(數組,鏈表,樹......)來存儲在同一個桶中發生衝突的元素,但這是一個不同的問題,而不是散列表和散列映射之間區別的一部分。
爲了跟進,看起來像C#中的字典和散列表有所不同,但這又不是我正在尋找的。 –