您将获得一个n个整数的未排序数组,并且您希望查找数组中是否有任何重复项(即任何整数出现多次)。 描述一个算法(用两个嵌套循环实现)来做到这一点。
我对算法的描述:
在第1步中,我们编写一个while循环来检查数组是否为空/ null,如果数组不为null,则继续进行内循环。
第2步,我们现在编写一个for循环来运行n-1的迭代,在该循环中我们将分配给当前(变量)数组中的第一个索引(在第一次迭代中),我们将通过索引更新当前变量每次通过迭代+ 1,这意味着第一次,当前将保持数组中的第一个索引,第二次,它将保持数组中的第二个索引,依此类推,直到循环结束。
第3步,我们将在for循环中编写一个循环(在步骤2中使用),将当前数字与数组中的所有整数进行比较,如果整数等于下一个数字,那么我们将使用printf语句打印数字更新下一个以保存数组中的下一个索引并使用它来与当前变量进行比较并执行此操作直到将其与数组中的所有整数进行比较,并且一旦完成此操作,将更新当前变量以存储数组的下一个索引,并将该特定数字与数组中的所有整数进行比较。
算法是否正确? (根据问题)......你的建议会很感激。和不!它不是一个家庭作业问题。感谢您的时间。
复杂性肯定是 O(N ^ 2)= N *((N + 1)/ 2)或 O(N ^ 2) < / strong>以简化的方式。
编辑:
我添加了一个更有效的算法描述(在下面的问题中)。但回到上面的问题,它是否适合作为考试问题的答案? (它已经出现在以前的论文中,所以我非常感谢你的帮助)。
如果我们限制输入数据以实现某种最佳情况,那么如何限制输入数据以实现更好的Big O复杂度?描述处理此有限数据的算法,以查找是否存在重复数据。 Big O的复杂性是什么?
如果我们将数据限制为,例如,数组大小为5(n = 5),我们可以将复杂度降低到O(N)。如果对数组进行排序,那么我们需要的只是一个循环来将每个元素与数组中的下一个元素进行比较,这将查找是否存在重复项。这只是意味着如果给我们的数组默认(或幸运)已经排序(从最低到最高值),在这种情况下减少将从O(N ^ 2)到O(N),因为我们不会需要内部循环来比较整数进行排序,因为它已经被排序,因此我们可以实现一个循环来比较整数和它的后继,如果遇到重复,那么我们可以,例如,我们可以使用printf语句来打印重复并继续迭代循环n-1次(这将是4) - 结束程序一旦完成。这个算法中最好的情况是O(N),因为性能线性增长并且与输入/数据的大小成正比,所以如果我们有一个大小为50的排序数组(数组中有50个整数)那么迭代将是n-1(循环将迭代50-1次),其中n是数组的长度为50.该算法中的运行时间与输入大小成正比增加。这只是意味着在排序数组中,操作执行所需的时间完全取决于数组的输入大小。
P.S。当然还有其他算法有效且速度更快但是从我的知识和问题的问题是在第一个问题中更好的复杂性,我相信这个算法实现了这一点。 (如果我错了,请纠正我) - 谢谢:)
答案 0 :(得分:3)
您描述了三个循环,但第一个实际上只是一个条件(If为null或空中止)。
剩下的算法听起来不错,除了我说而不是&#34;当前将保留阵列中的第一个索引&#34; (哪些挑剔者坚持在C中总是0)&#34;当前将保持数组中第一个元素的值&#34;或者这样。
顺便说一句(虽然我理解它是一种练习作业)它的效率非常低(我认为n ^ 2是正确的)。我强烈要求在数组上放一个循环,将检查过的数字复制到某种排序结构中并在其中进行二进制搜索。 (作为一名教师,我让我的学生首先描述一棵平衡的树,这样他们就可以在这里使用它,就像虚拟图书馆一样;-))。