Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用字典而不是排序然后搜索_Python_Algorithm_Sorting_Dictionary - Fatal编程技术网

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是的,如果你在一个固定列表中有多次搜索,那么你的技术肯定会更好,这是一种常用的方法。