返回首页

哈希表:搜索的有效手段介绍
当我曾经参与的电信顾问公司的路由优化软件的设计,所需的组件是为寻找最低成本路由机制沟通的网络站点之间的交通需求。换句话说,所有的电信运营商提供了最好的关税的有效手段。
有大量不同类型的电话路由的关税,无论是地理,地理,移动,保险费率,freefone,国际等,经常受到改变。关注的是创建一个代表电话号码字符串和其相关的关税之间的映射问题准确,快速的方式。
寻找大型网络上的数字成千上万的关税时,顺序搜索任何东西,但简单的例子是不切实际的商业成本最低的路由包。二进制搜索排序列表进行了调查,是一个很大的进步,给予了良好的业绩,即使在非常大的列表,类似于平均为O(log n)的。也有人意识到,哈希表查找最快的手段之一,通常在固定的时间为O(1)执行。关于哈希表
哈希表是一个软件的数据结构的基础上,使用一个索引查找表,显着加快映射的想法。鉴于电话数字通常代表字符串和数字表示的关税,我们不能直接使用字符串索引数组。相反,我们计算字符串的索引值使用一种特殊的散列函数,并使用该指数值访问数组,包含预先定义的关税,我们希望。世界上真正的散列
在现实中,完美的哈希是小于直接实现。通常发生的是哈希函数有时会映射到两个或两个以上的不同弦上相同的索引值,作为碰撞。为了解决这个问题,我们的哈希表需要映射到字符串链表的每一个潜在的选择,不只是一个单一的,因此,通过搜索挂钩的候选人名单,我们可以找到我们后,以及关税的价值,它包含的字符串。使用顺序搜索(循环)时,需要找到我们所追求的比较平均数是N / 2。当使用哈希表,平均数需要比较的是,加上一个哈希函数的计算。定义一个哈希表类
这是定义的类来实现的哈希表。哈希表本身就是一个链表的索引数组。这些链表大多将包含没有一个条目。当多个字符串散列相同的索引值发生碰撞时,该项目被添加到相同的链表通过新增的功能:

class HashTable

{

private:

    int hash( const char* str ) const;

    LinkedList list[ TableSize ];

    LinkedList const & FindList( const char* str ) const;



public:



    void Add( const char* str, int id );

    bool Get( const char* str, int& value );

};

下面是哈希函数的选择,这是作为一个随机字符串方式的转变和添加算法。{C}
要找到相应的链接在哈希表中的列表,它是一个简单的计算哈希值,并使用此值,以正确的链表索引的问题:
// Return the linked list containing one or more items

LinkedList const & HashTable::FindList( const char* str ) const

{

    int h = hash( str );

    return list[ h ];

}
用法示例
下面是一些代码,概述了如何使用HashTable的API来添加新的项目和使用的哈希算法搜索项目:{体C3}
{A1} Visual Studio项目也是下载。| AndyUk06

回答

评论会员:?AndyUk06 时间:2012/02/06
您有这里没有真正的新阳光下是相当正确的。我想尝试,并放在一起,一个最低限度的版本,这是非常简单的使用,但仍然可以处理诸如碰撞,让人们可以把它和修改他们喜欢的任何方式。尤其是允许他们轻松地与自己的哈希函数或丹・伯恩斯坦的,异,SDBM等实验

从我所看到的,是不是有大量的C例子,既简单,使用和理解的智能外行
评论会员:奥斯卡・考尔菲德 时间:2012/02/06
你是对的,这样一个简单的方法是完全我一直在寻找

5月...感谢
评论会员:沙克蒂米斯拉 时间:2012/02/06
尝试总是好的。但这里有几个问题/建议:
有没有提供链接。
你可以看看其他散列函数库,如升压的哈希(如果您使用其他升压元件)
它总是更好的使用上,其他一些散列函数库和基地您的代码,如果时间和成本许可证。如{A2}
或std :: TR1 ::哈希或{A3的}
在这个你可以建立你的图书馆作为一个政策的组合:
| AndyUk06
评论会员:游客 时间:2012/02/06
嗨,积极建言献策的感谢。此外,我认为你会发现,提供的链接索引链表实现代码-这些在本质上的枷锁。在发生碰撞时,也就是2个或多个字符串散列相同的索引,链表,但更多的项目添加到它。它是通过遍历链表,直到我们到达该项目包含的价值,我们想要的。也许需要一些额外的get函数的解释修改为'1111月16
。沙克蒂米斯拉
评论会员:游客 时间:2012/02/06
是,这将有助于。,也许你可以给一些性能的措施,并告诉如何更好或更坏,它执行