数据结构与算法--哈希

数据结构与算法

哈希

现在, 有这么一个问题: 我要存储 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的元素容量大小的数组, 显然, 这是极其浪费空间的,

[未完…]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值