为什么在暴力遍历中,为什么数组转字典是优化计算速度?
字典的话可能是
map1, map2, map3
for range map1{}
for range map1{}
for range map1{}
算法的复杂度比比就知道了
原因是什么?因为无论是顺序查找,二分,索引,还是二叉平衡树,二叉查找树,甚至更高的红黑树这些,它们查找都是基于一个原则:比较。它们在查找的过程中会比较值和待查找值的情况,这个过程非常的大,也要算进时间复杂度,而 hash 是一种特殊的方法,它并没有比较这个过程,它参考了数组随机存取的思路,直接拿到目标内存的地址,直接查表。
那么这个地址是怎么拿到的?这就是 hash 函数的作用,但是有时候地址冲突怎么办?这就是 hash 冲突,所以怎么选取 hash 函数,怎么解决冲突,对时间复杂度都有很大的影响。
现在有一个 array,是这样的 [1,2,5,67,7,8,9],要查看 7 这个值,如果我顺序查找,那么就只能遍历,先 1 和 7 比较,然后 2 和 7 比较,一直到 7 和 7 相等,这有比较的过程。
由于 hash table 是 key-value 的,现在假设我们最终的 hash table 就是 [1,2,5,67,7,8,9] 这个样子,我们要查看 7,假设 7 的 key 是 aaa,那么我们在 hash_table[“aaa”] 这个过程发生了什么呢?
首先,hash_func(“aaa”) 进行处理,得到一个地址,就是 4,然后就变成 hash_table[4] 直接查找了。这个过程就是 array 的顺序查找,显然是没有比较过程的。
建议你自己实现一个 hash table,这是个很重要的数据结构。
第二个问题你问得就有问题了,甚至不是一个问题。你需要自己学一下相关的知识。。建议直接用 c 实现一下,其实不难,一个下午就能理解个大概,但是对以后的帮助很大的。
什么是 X-Y 问题: https://coolshell.cn/articles/10804.html
看了原贴,根源在于第二步和第三步有过滤
以第二步为例,你要遍历每个客户的数据,对应主的 arr2 和 map2 会进行筛选,当然是 map 更快