让我们说我们想在数组中找到一些已知的键并提取值。有两种可能的方法(可能更多?)来做到这一点。线性方法,在此期间我们将每个数组键与针O(N)
进行比较。或者我们可以对此数组O(N*log(N))
进行排序并应用二进制搜索O(log(N))
。我有几个问题。
因此,我可以看到排序与搜索密切相关,但独立排序是无用的。排序是简化搜索的工具。我对么?或者还有其他任何排序实现?
如果我们要谈论搜索,我们可以搜索未排序的数据O(N)
并排序O(N*log(N)) + O(log(N))
。搜索可以与排序分开存在。如果我们只需要在数组中找到一些我们应该使用线性搜索的东西,如果重复搜索,我们应该对数据进行排序并在执行搜索之后?
答案 0 :(得分:1)
在每次搜索之前都不要认为需要O(n * lg(n))
排序。这将是荒谬的,因为O(n * lg(n)) + O(log(n)) > O(n)
对随机订单数据进行线性搜索会更快,平均为O(n/2)
。
我们的想法是首先使用O(n * lg(n))
算法对随机数据进行一次排序,然后按顺序添加排序前添加的任何数据,以便之后的每次搜索都可以在O(lg(n))
时间内完成。
在查看hash tables
时,您可能会感兴趣,这是一种未排序但O(1)
常量访问时间的数组。
答案 1 :(得分:1)
极少数情况下,您要创建N个项目的数组,然后只搜索一次。因此,改善保存项目的数据结构以改善排序时间通常是有利可图的(在所有搜索中分摊设置时间并查看是否保存了所有时间)
但是还有许多其他注意事项:您是否需要在集合中添加新项目?您需要从集合中删除项目吗?您是否愿意花费额外的内存来改善排序时间?您是否关心将项目添加到集合中的原始顺序?所有这些因素都会影响您对容器和搜索技术的选择。