什么是可以在非排序数组上完成的最快搜索?

时间:2010-06-07 13:58:21

标签: c search data-structures

如何在非排序数组中快速搜索?除了线性搜索之外,我无法想到任何其他搜索机制。

任何指针都会有所帮助。

8 个答案:

答案 0 :(得分:7)

是的,在没有对数据进行排序的情况下,线性搜索与您可以做的一样好。

答案 1 :(得分:4)

给定一个真正随机的非排序数组,线性搜索是最好的方法。

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

如果没有对数组进行排序,确实没有任何优化要做。所有优化都取决于对阵列的某些知识得到保证。没有它,你不能假设任何东西,必须线性地浏览每个项目。

答案 4 :(得分:1)

正如其他人所提到的,线性搜索是可行的方法。但是,根据您的设置,以下内容可能与加快速度相关,也可能不相关。

如果搜索某些项目的频率高于其他项目,则可以使用小型缓存。例如,如果您正在为文件系统实现lookup()操作(数据最终存储在磁盘上的某个位置),则缓存可以提供极大的帮助。

您可以对数据进行排序/筛选,以便最常查找的项目位于数组的开头附近吗?

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

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

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

答案 5 :(得分:1)

有一些聪明的方法可以优化线性搜索,但最终它们都没有真正支付性能,但却使代码容易出错且难以理解。所以我建议坚持简单的线性搜索(即简单的迭代+比较)。

答案 6 :(得分:0)

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

如果可以多次搜索,您可以做一些事情。

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

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

除非列表非常大且搜索速度慢,否则您不应该为这些中的任何一个烦恼。一般来说,你写的代码越少,每个人就越好

答案 7 :(得分:0)

如果可以,您可以考虑首先更改数据的存储/创建方式。而不是将项添加到数组,创建一个完整的二进制树(或其他)并使用它。它使得操作数据的速度稍慢,但它不应该像每次重新排序数据一样慢,并且会使搜索速度更快。