比方说,我有:
Key | Indexes | Key-values ----+---------+------------ 001 | 100001 | Alex 002 | 100002 | Micheal 003 | 100003 | Daniel
可以说,我们想搜索001,如何使用哈希表进行快速搜索过程?
是不是和我们在mysql中使用"SELECT*from .."一样?他们说,从头到尾搜索"SELECT*"很多,但哈希表不是吗?为什么以及如何?
通过使用哈希表,我们是否减少了我们正在搜索的记录?怎么样?
任何人都可以演示如何在mysql查询代码中插入和检索哈希表进程?例如,
SELECT * from table1 where hash_value="bla" ...
另一种情况:如果索引类似于S0001,S0002,T0001,T0002等.在mysql中我可以使用:
SELECT * from table WHERE value = S*
是不是一样快?
一个简单的哈希表通过将项保存在多个列表而不是一个列表上来工作.它使用非常快速且可重复(即非随机)的方法来选择保留每个项目的列表.因此,当需要再次找到该项时,它会重复该方法以发现要查找的列表,然后在该列表中执行正常(慢速)线性搜索.
通过将项目划分为17个列表,搜索速度提高了17倍,这是一个很好的改进.
虽然当然只有列表的长度大致相同才有效,所以选择一种在列表之间分配项目的好方法很重要.
在您的示例表中,第一列是键,我们需要找到该项.我们假设我们将维护17个列表.要插入内容,我们对名为hashing的键执行操作.这只是将键变成一个数字.它不返回随机数,因为它必须始终为同一个键返回相同的数字.但与此同时,这些数字必须"广泛传播".
然后我们得到结果数并使用模数将其缩小到我们列表的大小:
Hash(key) % 17
这一切都发生得非常快.我们的列表是一个数组,所以:
_lists[Hash(key % 17)].Add(record);
然后,使用该键找到项目:
Record found = _lists[Hash(key % 17)].Find(key);
请注意,每个列表可以是任何容器类型,也可以是您手动编写的链接列表类.当我们Find
在该列表中执行a 时,它的工作方式很慢(检查每条记录的键).