Questions tagged «algorithm-analysis»

5
分而治之算法–为什么不分成两个以上的部分?
在快速排序和合并排序等分而治之算法中,通常将输入(至少在介绍性文本中)分成两部分,然后递归处理两个较小的数据集。对我来说,如果这两个部分花费的时间少于处理整个数据集的一半,这将使解决问题更快。但是,为什么不将数据集分为三部分呢?四个?n? 我猜想将数据拆分为许多子集的工作不值得,但是我缺乏直觉,无法看到一个应该在两个子集处停止。 我也看到了很多有关3向快速排序的参考。什么时候更快?实际使用什么?


5
算法:如何将O(n)和O(nlog(n))求和?
我有以下算法,该算法查找重复项并将其删除: public static int numDuplicatesB(int[] arr) { Sort.mergesort(arr); int numDups = 0; for (int i = 1; i < arr.length; i++) { if (arr[i] == arr[i - 1]) { numDups++; } } return numDups; } 我试图找到这种情况下最坏的情况。我知道mergesort是nlog(n),在我的for循环中,我正在遍历整个数据集,因此算作n。我不确定该如何处理这些数字。我应该把它们加在一起吗?如果要这样做,我将如何做?

8
为什么将需要排序数据的二进制搜索比线性搜索更好?
我一直听说线性搜索是一种幼稚的方法,并且由于渐近复杂性的提高,二进制搜索的性能要优于线性搜索。但是我从来不明白为什么在二进制搜索之前需要排序时,为什么它比线性搜索更好? 线性搜索为O(n),二进制搜索为O(log n)。这似乎是说二进制搜索更好的基础。但是二进制搜索需要O(n log n)对最佳算法进行排序。因此,二进制搜索实际上不应该更快,因为它需要排序。 我正在阅读CLRS,作者在其中表示,在插入排序中而不是使用朴素的线性搜索方法,最好使用二进制搜索来查找必须插入项目的位置。在这种情况下,这似乎是合理的,因为在每次循环迭代时,都有一个可以应用二分查找的排序列表。但是在通常情况下,对于不能保证我们需要搜索的数据集,由于排序要求,使用二进制搜索实际上并不比线性搜索差吗? 我是否忽略了使二进制搜索比线性搜索更好的实际考虑因素?还是不考虑排序所需的计算时间而认为二进制搜索比线性搜索更好?

2
试图了解2N lnN与Quicksort的比较
我正在对Sedgewick的Algorithms一书中的quicksort进行分析。他为quicksort中的比较数创建了以下递归关系,同时对N个不同项目的数组进行了排序。 我很难理解这一点...我知道任何元素成为枢轴都需要1 / N的概率,并且如果k成为枢轴,那么左子数组将具有k-1个元素,而右子数组数组将包含Nk个元素。 1.分区成本如何变为N + 1?做分区需要N + 1比较吗? 2.Sedgewick说,对于k的每个值,如果将它们相加,则划分元素为k的概率+两个子数组的成本,您将得到上述方程式。 有人可以解释一下,以便那些数学知识(我)较少的人可以理解吗? 具体来说,您如何获得方程式中的第二项? 这个词到底代表什么?

7
大哦表示法没有提及常数值
我是一名程序员,刚刚开始阅读算法。我对Bog Oh,Big Omega和Big Theta等符号并不完全相信。原因是根据Big Oh的定义,它指出应该存在一个函数g(x),使其始终大于或等于f(x)。对于n> n0的所有值,f(x)<= cn。 为什么我们在定义中不提及常数值?例如,假设一个函数6n + 4,我们将其表示为O(n)。但是,定义对于所有常数值都适用并不合适。仅当c> = 10且n> = 1时,这才适用。对于小于6的c值,n0的值将增加。那么,为什么不将常量值作为定义的一部分呢?


1
可以改善Damerau-Levenshtein吗?
我最近从Wikipedia上的伪代码实现了Damerau-Levenshtein距离算法。我找不到它是如何工作的任何解释和伪采用完全无信息变量的名称,如DA,DB,i1,和j1我留下抓我的头。 这是我在Python中的实现:https : //gist.github.com/badocelot/5327337 Python的实现帮助我遍历了程序并弄清了正在发生的事情,将变量重命名为更有用的名称。我很熟悉Wagner-Fischer的方法来计算Levenshtein距离,因此有了参考系。 冒着过长的风险,这就是我对Damerau-Levenshtein的理解: 神秘变量: DA(last_row在我的代码中)是一种地图,其中包含每个元素被查看到的最后一行;在我的代码中,这是一个实际的Python字典 DB(last_match_col)保留最后一列,其中输入的字母b与a当前行的输入字母匹配 i1(last_matching_row)是来自DA当前字母的行号b j1只是DB/ 值last_match_col可能被更新之前的副本;在我的代码中,我只是移动了last_match_col更新并消除了此变量的位置 换位成本: H[i1][j1] + (i-i1-1) + 1 + (j-j1-1) 正在计算将当前字符换成已知b的最后一个字符(最后一个匹配项)所花费的费用,将之间的所有字符都视为增加或删除。ba 成本要素: H[i1][j1] 将基本成本还原到转置之前的计算点,因为找到转置会使先前的工作无效 (i-i1-1) 是当前行与匹配当前字符的最后一行之间的距离,这是需要删除的数量 (j-j1-1) 是当前列与具有匹配项的最后一列之间的距离,即相加次数 多余+ 1的只是换位本身的成本 如果此分析不正确,我很想知道我哪里做错了。就像我说的那样,我找不到关于该算法如何在线工作的任何详细说明。 改进版? 已经想通了这一点,虽然,它让我吃惊的是,通过计算成本都增加和调换字母之间的缺失似乎有缺陷的:一个加法和一个删除相当于替代,这,这是不检查。 如果一切正确,那么解决方案应该是微不足道的:转置字母之间的字母成本应为添加和删​​除中的较高者:将尽可能多的字母转换为替换,并添加所有剩余的添加或删除。 因此成本为: H[i1][j1] + max((i-i1-1), (j-j1-1)) + 1 这是该版本的代码:https : //gist.github.com/badocelot/5327427 从一些简单的测试来看,这似乎是正确的。例如,“ abcdef”->“ abcfad”的编辑距离为2(转置“ d”和“ f”,将“ e”更改为“ …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.