如何在非排序数组中快速搜索?除了线性搜索之外,我无法想到任何其他搜索机制。
任何指针都会有所帮助。
答案 0 :(得分:7)
是的,在没有对数据进行排序的情况下,线性搜索与您可以做的一样好。
答案 1 :(得分:4)
给定一个真正随机的非排序数组,线性搜索是最好的方法。
如果可以假设数据被粗略排序,那么您可以使用某种启发式方法做得更好。
答案 2 :(得分:3)
线性。或者对数组进行排序并在日志时搜索它。
答案 3 :(得分:1)
如果没有对数组进行排序,确实没有任何优化要做。所有优化都取决于对阵列的某些知识得到保证。没有它,你不能假设任何东西,必须线性地浏览每个项目。
答案 4 :(得分:1)
正如其他人所提到的,线性搜索是可行的方法。但是,根据您的设置,以下内容可能与加快速度相关,也可能不相关。
如果搜索某些项目的频率高于其他项目,则可以使用小型缓存。例如,如果您正在为文件系统实现lookup()操作(数据最终存储在磁盘上的某个位置),则缓存可以提供极大的帮助。
您可以对数据进行排序/筛选,以便最常查找的项目位于数组的开头附近吗?
将数据存储在两组中是否切实可行?一个是排序的,一个是未分类的?已排序,您应该能够快速搜索您的项目。如果找不到,请转到未排序列表并进行线性搜索。为什么?虽然您说在每次插入后插入是不切实际的,但是从未排序的列表中定期插入到排序列表中是否实用/有效?
一定要在一个未排序的数组中吗?您可以将数据放入已排序数据块中吗?也就是说,每个块可能有1000个已排序的条目。搜索每个排序的块可能比搜索整个未排序的列表更快。
只是一些想法。它们可能不适用于您的情况,但希望它们有用。
答案 5 :(得分:1)
有一些聪明的方法可以优化线性搜索,但最终它们都没有真正支付性能,但却使代码容易出错且难以理解。所以我建议坚持简单的线性搜索(即简单的迭代+比较)。
答案 6 :(得分:0)
一旦您的代码显示未排序的列表,是的,您将需要进行线性搜索。
如果可以多次搜索,您可以做一些事情。
首先,当然是对列表进行排序。这将使第一次查找花费相当长的时间,但后续的查找会更快。
其次,我建议缓存结果。对于大多数用法,我发现随后的查找很可能是相同的值,或者是附近的值。
除非列表非常大且搜索速度慢,否则您不应该为这些中的任何一个烦恼。一般来说,你写的代码越少,每个人就越好。
答案 7 :(得分:0)
如果可以,您可以考虑首先更改数据的存储/创建方式。而不是将项添加到数组,创建一个完整的二进制树(或其他)并使用它。它使得操作数据的速度稍慢,但它不应该像每次重新排序数据一样慢,并且会使搜索速度更快。