Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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
C 在未排序的数组上可以进行的最快搜索是什么?_C_Search_Data Structures - Fatal编程技术网

C 在未排序的数组上可以进行的最快搜索是什么?

C 在未排序的数组上可以进行的最快搜索是什么?,c,search,data-structures,C,Search,Data Structures,如何在未排序的数组中快速搜索?除了线性搜索之外,我想不出任何其他搜索机制 任何指针都会有帮助。是的,如果不对数据进行排序,线性搜索几乎可以做到最好。线性搜索。或者对数组进行排序,并在日志时间进行搜索。对于真正随机的未排序数组,线性搜索是最好的方法 如果可以假设数据是粗略排序的,那么使用某种启发式方法可能会做得更好。如果不对数组进行排序,实际上没有任何类型的优化。所有的优化都取决于对阵列有一定的了解。没有这一点,你就不能假设任何事情,必须线性地遍历每一项。一旦你的代码显示了一个未排序的列表,是的,

如何在未排序的数组中快速搜索?除了线性搜索之外,我想不出任何其他搜索机制


任何指针都会有帮助。

是的,如果不对数据进行排序,线性搜索几乎可以做到最好。

线性搜索。或者对数组进行排序,并在日志时间进行搜索。

对于真正随机的未排序数组,线性搜索是最好的方法


如果可以假设数据是粗略排序的,那么使用某种启发式方法可能会做得更好。

如果不对数组进行排序,实际上没有任何类型的优化。所有的优化都取决于对阵列有一定的了解。没有这一点,你就不能假设任何事情,必须线性地遍历每一项。

一旦你的代码显示了一个未排序的列表,是的,你将需要进行线性搜索

但是,如果它可能被搜索不止一次,您可以做一些事情

当然,首先是对列表进行排序。这会使第一次查找花费相当长的时间,但后续查找会更快

其次,我建议缓存结果。对于大多数用法,我发现后续查找很有可能是相同的值,或者是附近的值


不过,你不应该为这两个问题而烦恼,除非列表非常大而且搜索速度很慢。一般来说,<强>代码越少越好,每个人都越强越好。

< P>如果你能够,你可以考虑首先改变数据存储/创建的方式。与其向数组中添加项,不如创建一个完整的二叉树(或其他什么)并使用它。它使操作数据的速度稍慢,但不应像每次重新排序数据那样慢,而且会使搜索速度更快。

正如其他人所提到的,线性搜索是一种方法。但是,根据您的设置,以下内容可能与加速有关,也可能与加速无关

如果搜索某些项目的频率比搜索其他项目的频率高,则小型缓存可能会很有用。例如,如果您正在为文件系统(数据最终存储在磁盘上的某个位置)实施lookup()操作,那么缓存将非常有用

您是否可以对数据进行排序/筛选,以使最常查找的项位于数组的开头附近

将数据存储在两组中是否可行?一个已排序,一个未排序?排序后,您应该能够快速搜索您的项目。如果找不到,请转到未排序的列表并线性搜索该列表。为什么?虽然您说过在每次插入后插入是不实际的,但定期从未排序列表插入排序列表是否切实可行/有效

它必须全部在一个未排序的数组中吗?您可以将数据放入已排序的数据块中吗?也就是说,每个块可能有1000个已排序的条目。搜索每个已排序的块可能比搜索整个未排序的列表更快


只是一些想法。它们可能不适用于您的情况,但希望它们会有所帮助。

有一些聪明的方法可以优化线性搜索,但最终没有一种方法真正在性能方面有所提高,但会使代码容易出错且难以理解。因此,我建议坚持简单的线性搜索(即简单的迭代+比较)。

您询问速度的事实似乎意味着您希望进行许多这样的查找。。。这意味着你可以创建一个辅助结构,也许。。。排序数组(可能是指向原始数组而不是副本的指针)。有什么原因限制您使用未排序的数组吗?是的,我无法在每次插入时对数组进行排序,因为这样对我来说会更昂贵。与之相比,线性搜索的成本更低。@Jay:当然,这完全取决于你的具体情况。如果您的性能瓶颈在(线性)搜索中,那么可能有更好的选择-无论是在构造时进行排序(可以想象,使用二进制搜索和使用指针/索引数组,而不是在实际对象周围移动,这可能会很便宜)或者在最后分类一次。也许你看问题的方式不对。您说不能每次插入数组时都对其进行排序。因此,对数组进行排序,然后以保持排序的方式插入元素不是更好吗?或者这是不可能的?请指定您试图解决的问题,这样您可能会得到更好的答案。@Jay:如果您可以使用红黑树(例如)而不是数组,则在最坏的情况下,insert和search都是O(logn)。如果你可以使用一个哈希表,它们在一般情况下是O(1),但是O(n logn)+O(logn)>O(n)。如果这是一次搜索排序,它是无用的。甚至更快的排序(如果适用的话)仍然只有O(n)。我同意如果要多次搜索数组,排序会更好。@Yacoby:除非所讨论的数据“符合”非基于比较的排序(其中一些是线性的)。即使是这样的搜索也可能不会带来任何回报,但仍然可以通过更少的搜索实现收支平衡。方法:你提到的“聪明方法”是什么?使用哨兵,或者倒计时而不是向上。方法:谢谢!了解他们。@Lazer更多详情,请参阅我的帖子。