Python 使用字典而不是排序然后搜索
我正在研究哈希表,突然想到: 为什么不使用字典来搜索元素,而不是先对列表排序,然后进行二进制搜索呢?(假设我要搜索多次)Python 使用字典而不是排序然后搜索,python,algorithm,sorting,dictionary,Python,Algorithm,Sorting,Dictionary,我正在研究哈希表,突然想到: 为什么不使用字典来搜索元素,而不是先对列表排序,然后进行二进制搜索呢?(假设我要搜索多次) 我们可以在O(n)(我认为)时间内将列表转换为字典,因为我们必须遍历所有元素 我们将所有这些元素添加到字典中,这需要O(1)时间 当字典准备好后,我们可以在O(1)time(average)中搜索任何元素,O(n)是最坏的情况 现在,如果我们讨论的是平均大小写O(n)比其他排序算法更好,因为它们最多只取O(nlogn)。如果我所说的都是对的,那么为什么不这样做呢 我知道你可以
O(n)
(我认为)时间内将列表转换为字典,因为我们必须遍历所有元素李>
O(1)
时间O(1)
time(average)中搜索任何元素,O(n)
是最坏的情况O(n)
比其他排序算法更好,因为它们最多只取O(nlogn)
。如果我所说的都是对的,那么为什么不这样做呢
我知道你可以用排序后的元素做很多其他的事情,而这些事情在未排序的字典或数组中是做不到的。但是如果我们只坚持搜索,那么这不是比其他排序算法更好的搜索方法吗?二进制搜索是一种搜索技术,它利用了键的列表在要搜索的键
已经排序,它不需要您排序然后搜索,使其最坏情况下的搜索时间O(log n)
如果您没有键的排序列表,并且想要搜索键
,那么您必须进行线性搜索,在最坏的情况下,线性搜索将以O(n)
复杂度运行,没有必要先进行排序,然后再进行搜索,因为最著名的排序算法只能在O(n log n)
时间内工作
从键
的列表
构建字典
,然后执行查找在这里没有任何好处,因为线性搜索将产生相同的结果以获得更好的性能,并且还需要辅助内存,这在字典
的情况下是需要的;但是,如果您有多个查找,并且使用字典的键空间很小,则会有很大的优势,因为构建字典是O(n)
的一次工作,后续的查找可以通过O(1)
完成,代价是字典将使用的一些内存,一个设计良好的哈希表可以胜过排序和搜索
对于正确的选择,有许多因素在起作用,例如就地需求、数据集的动态性、搜索数量与插入/删除、易于构建有效的哈希函数……或者我们只是在O(n)中迭代未排序的列表要搜索元素?@timgeb那么如果你必须搜索n次,那么你就有了复杂性n*O(n)
,如果你先排序,然后搜索n次,那就是n*O(logn)
。根据约翰理论,你可以在O(1)
时间内搜索任意次数,这比你想要的要好得多say@jamessmith是 啊但是你没有提到你想搜索很多次。在这种情况下,将列表转换为O(n)中的一个集合(为什么需要dict?),然后在O(1)中执行任何后续的包含检查。只有当您需要顺序和/或重复元素时,才有助于保持可对分的已排序列表。@timgeb那么为什么要使用排序算法进行搜索呢?这是一个更好的方法,我认为将列表转换为集合(作为hashmap的特例)是一种非常常见的做法,用于快速重复查找。如果空间很小,使用排序列表可能更可取,因为稀疏填充的哈希集将比原始列表占用更多的空间(哈希集越密集,冲突就越大)。“如果您已经知道要查找的密钥,则不会称之为搜索”-我不理解这句话。你正在寻找你事先知道的钥匙的存在。你怎么能搜索你不知道的东西呢?“最著名的排序算法”-事实上,数学证明排序所需的时间不能少于O(nlogn)+c
。今天的算法试图最小化常数c
“线性搜索在最坏的情况下会以O(n)复杂度运行,没有必要先排序,然后再搜索,因为最著名的排序算法只能在O(n log n)
时间内工作。“你为什么把这当作我在问题中说过的情况?”(假设我想搜索多次)“@johnsmith是的,如果你在一个固定列表中有多次搜索,那么你的技术肯定会更好,这是一种常用的方法。