Algorithm 给定一个由2n个元素组成的数组,其中n个元素相似,n个元素不同

Algorithm 给定一个由2n个元素组成的数组,其中n个元素相似,n个元素不同,algorithm,Algorithm,给定一个由2n个元素组成的数组,其中n个元素相同,其余n个元素都不同。编写一个C程序,找出数组中出现n次的值 我是这样想的- 比较a[i]和a[i+1],并 比较a[i]和a[i+2] 和返回元素 这将在O(n)时间内运行..有谁能给出更好的解决方案吗 我正在研究一些解决方案,它是这样说的- 声明两个变量a)count变量以跟踪多数元素的计数 多数元素 执行for循环并重复以下步骤4-6,直到到达数组的末尾 如果当前数组元素等于多数元素,则递增计数 否则,如果计数为0,则使用当前数组元素和增量计

给定一个由2n个元素组成的数组,其中n个元素相同,其余n个元素都不同。编写一个C程序,找出数组中出现n次的值

我是这样想的- 比较a[i]和a[i+1],并 比较a[i]和a[i+2] 和返回元素

这将在O(n)时间内运行..有谁能给出更好的解决方案吗

我正在研究一些解决方案,它是这样说的-

  • 声明两个变量a)count变量以跟踪多数元素的计数
  • 多数元素
  • 执行for循环并重复以下步骤4-6,直到到达数组的末尾
  • 如果当前数组元素等于多数元素,则递增计数
  • 否则,如果计数为0,则使用当前数组元素和增量计数更新多数元素
  • 否则,如果计数不是0,则递减计数
  • 执行另一个for循环并计算数组中多数元素的出现次数,如果它是数组大小的一半,则我们找到了多数元素,否则就没有多数元素

  • 可以使用多数元素算法作为O(1)空间的O(n)解的基础

    您需要一个存储元素的空间。拾取第一个元素并存储它,如果下一个元素与存储的元素相同,则完成。如果没有,请从下一步重新启动算法。如果在这之后没有找到元素,这意味着元素是成对排列的,比如(a,b),(a,c),(a,d)或(b,a),(a,c),(a,d),(e,a)。。比较前四个元素,您就找到了重复的元素


    由于元素可以按任意顺序排列,所以无论您检查的是哪一个前n/2元素,它们都可能是不同的。所以没有比O(n)更好的解了。

    可以使用多数元素算法作为O(1)空间的O(n)解的基础

    您需要一个存储元素的空间。拾取第一个元素并存储它,如果下一个元素与存储的元素相同,则完成。如果没有,请从下一步重新启动算法。如果在这之后没有找到元素,这意味着元素是成对排列的,比如(a,b),(a,c),(a,d)或(b,a),(a,c),(a,d),(e,a)。。比较前四个元素,您就找到了重复的元素


    由于元素可以按任意顺序排列,所以无论您检查的是哪一个前n/2元素,它们都可能是不同的。因此,没有比O(n)更好的解。

    这里是一个使用线性时间多数投票算法的最多两次通过和O(1)空间的解(http://www.cs.utexas.edu/~moore/best ideas/mjrty/index.html)

    选择第一个元素并扫描数组以确定这是否是重复元素(扫描剩余数组的一半就足够了)。如果元素是重复元素,那么我们就完成了;如果没有,则在Remining阵列中应用线性时间多数投票算法


    我们检查第一个元素的原因是,只有当元素重复数组中元素数量的一半以上时,线性时间多数投票才有效。

    这里有一个使用线性时间多数投票算法的最多两次通过和O(1)空间的解决方案(http://www.cs.utexas.edu/~moore/best ideas/mjrty/index.html)

    选择第一个元素并扫描数组以确定这是否是重复元素(扫描剩余数组的一半就足够了)。如果元素是重复元素,那么我们就完成了;如果没有,则在Remining阵列中应用线性时间多数投票算法


    我们检查第一个元素的原因是,线性时间多数投票只有在元素重复数组中元素数的一半以上时才有效。

    我认为您的解决方案足够好,因为它最多只需要数组的一半。呃,您没有完成对算法的描述。但是,如果运行时是O(n),正如您所说的,那么您无法得到更好的大O。您必须至少通过输入的O(n)。1。声明两个变量a)count变量以跟踪多数元素的计数。2.多数元素。3.执行for循环并重复以下步骤4-6,直到到达数组的末尾。4.若当前数组元素等于多数元素,则递增计数5。否则,如果计数为0,则使用当前数组元素和增量计数更新多数元素。6.否则,如果计数不是0,则递减计数。7.执行另一个for循环并计算数组中多数元素的出现次数,如果它是数组大小的一半,则我们找到了多数元素,否则就没有多数元素。这与多数元素问题类似,您不能使用该算法。多数算法需要适当的多数,即从2n开始的n+1。仅仅n不足以让多数算法工作。我认为你的解决方案足够好,因为它最多只需要数组的半个过程。呃,你没有完成对算法的描述。但是,如果运行时是O(n),正如您所说的,那么您无法得到更好的大O。您必须至少通过输入的O(n)。1。声明两个变量a)count变量以跟踪多数元素的计数。2.多数元素。3.执行for循环并重复以下步骤4-6,直到到达数组的末尾。4.若当前数组元素等于多数元素,则递增计数5。否则,如果计数为0,则使用当前数组元素和增量计数更新多数元素。6.否则,如果计数不是0,则递减计数。7.执行另一个for循环并计算数组中多数元素的出现次数,如果它是数组大小的一半,则我们找到了多数元素,否则就没有多数元素。这与多数元素问题类似,您不能使用该算法。多数算法需要适当的多数,即从2n开始的n+1。仅仅n不足以让多数算法工作。