在 Swift 中实现哈希表?

Posted

技术标签:

【中文标题】在 Swift 中实现哈希表?【英文标题】:Implementing a HashTable in Swift? 【发布时间】:2015-02-25 23:17:05 【问题描述】:

我正在尝试在 Swift 中实现一个 HashTable。根据我的理解,哈希值用作数组中使用的索引。问题是哈希值是非常大的数字。

"1" => 4,799,450,059,485,597,623
"2" => 4,799,450,059,485,597,624
"3" => 4,799,450,059,485,597,629

使用这些哈希值生成数组索引的正确方法是什么?

class HashTable <K: Hashable, V> 

    private var values : [V?]

    init(size: Int) 
        values = [V?](count: size, repeatedValue: nil)
    

    func push(key: K, value: V?) 
        values[key.hashValue] = value
    

    subscript (key: K) -> V? 
        get 
            return values[key.hashValue]
        
        set 
            push(key, value: newValue)
        
    

【问题讨论】:

A Swift Dictionary is 是一个哈希表,那么将它重新实现为一个数组有什么好处呢? (特别是考虑到 Swift 没有稀疏数组的事实......) @matt 我知道,实现自己的好处是了解它们是如何工作的。我的代码不会创建稀疏数组吗? [V?](count: size, repeatValue: nil) 默认值为nil的特定大小的数组 这篇文章好像解决了这个waynewbishop.com/swift/hashtables 【参考方案1】:

我最终将 LinkedNodes 存储在数组中而不是值中。

hashIndex = hashValue % values.count

在LinkedList中搜索或删除多个节点时,我直接比较hashValues而不是hashIndex。 (处理碰撞)

想知道是否有更好的解决方案

【讨论】:

您好,您可以通过以下链接查看,这可能会有所帮助:github.com/raywenderlich/swift-algorithm-club/tree/master/…

以上是关于在 Swift 中实现哈希表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中实现线程安全的 HashTable (PhoneBook) 数据结构?

有哪些算法可用于调整哈希表的大小?

什么是哈希表以及如何在 C 中创建它? [关闭]

哈希表——swift字典的实现原理

swift 带有哈希表的多播代理

如何在 C# 中实现 sdbm 哈希函数?