我一直在学习Coursera上的DSA课程,本周介绍了搜索算法。而二进制搜索(O(logn))的复杂度优于线性搜索(O(n))。但是,考虑到首先对数组进行排序需要nlogn工作,为什么我要在未排序的数组中使用它呢。
如果二进制搜索只在数组已经排序的情况下使用,那么为什么这两种算法经常比较,因为显然它们有不同的用例。
Willem Van Onsem的答案很好地描述了将对同一个数组进行许多查询的情况,因此值得先花O(n log n)时间对数组进行排序。我的答案没有直接解决“未排序的数组”,但有一个常见的误解,即数组要么未排序,要么已排序,我认为值得解决这个误解,以防对任何读者有所帮助。
说清楚一点,我不认为你有这种特殊的误解;但我确实认为一些有这种误解的人会读到你的问题及其答案。
“排序”这个词有点误导。由于“排序”是一个过去式动词,它听起来像是一个排序算法被用来把数据排序。但是计算机科学家使用“排序”这个词的方式,它只是意味着数组是有序的,而不是暗示它以前不是有序的。
因此,当我们说二进制搜索只能用于“排序的数组”时,这并不意味着需要O(n log n)时间才能使数组“排序”。大量数据自然有序,无需进行任何排序工作。几个例子:
因此,在许多情况下,我们可以应用二进制搜索,而无需花费O(n log n)时间来排序需要搜索的序列。
我是否会在未排序的数组中使用它,因为首先对数组进行排序需要O(n log n)个工作。
通常情况下,一个人会对同一数据结构执行多个查询。事实上,以数据库为例。一个人获取具有给定主键的记录的频率高于添加记录的频率,这是有道理的。这是有道理的,因为如果查询的数量低于插入的数量,那么我们插入的数据永远不会被检索到,因此这些数据是“无用的”。
此外,排序元素列表或构建元素二叉树确实需要O(n log n)。但是更新二叉搜索树,例如AVL树[维基]需要O(log n)。因此,如果您通过添加一个元素、删除一个元素、更新一个元素等方式略微更改元素集合,则需要O(log n)来更改数据结构,并且您需要保持O(log n)查找。
对未排序的数据使用线性搜索,确实会胜过对少量查询的排序和二分搜索。从查询数量变大的那一刻起,线性搜索算法就会被二分搜索算法超越。
问题内容: 我正在使用elasticsearch从json文件过滤和搜索,并且我是这项技术的新手。所以我有点困惑如何在elasticsearch中写像查询一样的东西。 这是mysql查询。如何在Elasticsearch中编写此查询?我正在使用Elasticsearch 0.90.7版。 问题答案: 如果可能的话,我强烈建议您更新ElasticSearch版本,自0.9.x版本以来发生了重大变化。
我想实现一种将排序数组插入二叉搜索树的算法,但我不希望最终得到一棵只向一侧生长的树。 你有什么想法吗? 谢谢你。
我正在创建一个对象数组,其中应该通过线性方法和二进制方法进行搜索。 问题是如何使用适当的数据类型遍历数组并进行比较。 要搜索的对象数组的屏幕截图数组对象 这是食品类的代码 希望这能帮助我解释
考虑到这个问题:峰值元素是一个大于相邻元素的元素。 给定一个输入数组,其中num[i]≠ num[i 1],找到一个peak元素并返回其索引。 该数组可以包含多个峰值,在那种情况下将索引返回到任何一个峰值都是精细的。 示例:Array=[1,4,5,7,4,3,1]。峰值指数=3(即7)。 下面的代码非常有效(不仅仅适用于此测试用例): 我不明白它是如何工作的——我以为二进制搜索只是用于排序数组/
给定二叉查找树(BST)和整数val的根。 在BST中找到该节点的值等于val的节点,并返回以该节点为根的子树。如果这样的节点不存在,则返回null。 为什么'ans=root'不起作用??
本文向大家介绍在Javascript二进制搜索树中搜索值,包括了在Javascript二进制搜索树中搜索值的使用技巧和注意事项,需要的朋友参考一下 我们将使用BST的属性在其中查找元素。首先让我们看一下搜索的迭代实现- 示例 在此功能中,我们从根作为currNode开始,然后将我们的数据与currNode的数据进行比较。如果找到匹配项,则返回true,否则我们将继续根据数据与currNode数据