数据结构与算法
哈希
现在, 有这么一个问题: 我要存储 8989, 654, 546546, 3545, 565434 …这么一些 “很大的数字”, 并且存储之后我要能随机访问, 即在 *O(1)*的时间内访问到指定元素
方式一:
用数组(或链表)存储
arr[] = {8989, 654, 546546, 3545, 565434 …}
这样存储可以, 但是查找的时间复杂度是O(n)
for (int i=0; i<arr.length; i++) {
if (key == arr[i]) {
...
break;
}
}
或者, 我们可以存储后, sort()(排序)一下, 这样用二分查找就可以达到O(logn), 但是依旧达不到*O(1)*的时间复杂度
所以, 这种方式貌似不行
方式二
用二叉搜索树存储
对于方式一, 插入或删除都有瑕疵, 如果用平衡二叉搜索树的话, 那么插入,删除和查找可以达到 O(logn), 这是可以的.
但是,还不是最好, 我们需要一个*O(1)*的时间限度
方式三
想象一下, 对于8989, 654, 546546, 3545, 565434 …这些数, 我们可以这样存储以达到*O(1)*的时间复杂度
数组元素的值等于其下标, 这样就可以实现随机访问, 例如查找8989时, 可以
int key = 8989;
int ans = arr[key];
但是如果存储 1, 2, 3, 9999 这四个数就要开辟一个包含10000的元素容量大小的数组, 显然, 这是极其浪费空间的,
[未完…]