【问题标题】:What is the greedy approach for this?对此有什么贪婪的方法?
【发布时间】:2015-01-12 18:17:11
【问题描述】:

我们有一个由n 组成的数组,除了一个之外,它们都在这个数组中重复了偶数次;我们想找到重复奇数次的数字。

我认为最佳算法的时间复杂度比O( n Log(n) ) 好,因为我们可以对数组进行排序然后迭代它,当我们看到一个新数字时,我们增加一个累加器,当我们再次看到它时,我们减少累加器并在累加器不为零的每个成员的末尾都重复了奇数次。

另外我认为它没有比O(n) 更好的算法,因为如果有,那么它必须是O( Log(n) ),为此我们需要一个排序数组,但我们的初始数组不是。

【问题讨论】:

  • 数字是整数吗? (这很重要。)
  • 你可以在O(n) 中解决这个问题,如果你可以使用O(n) 空间:创建一个字典,将数字值映射到一个计数。
  • 顺便说一句,您认为算法不能比 O(n) 更好的推理是有缺陷的(尽管结论是正确的)。
  • 另外,请澄清“重复”是否意味着它们出现在数组中的连续运行中,或者如果您只想计算数组中的出现次数而不考虑它们的邻居。
  • @Dai 使用哈希表(又名字典)导致O(n) 最佳/平均情况,但O(n^2) 最坏情况。

标签: algorithm time-complexity greedy


【解决方案1】:

如果数字是整数,您可以对数组中的所有值进行异或运算。结果是重复奇数次的数字(这是正确的,因为x xor x = 0 对任何x 都是如此)。这个算法的复杂度显然是O(n)

【讨论】:

  • 注意我们的数字不是整数。它们是实数,但我不明白为什么我们不能异或实数?
  • @amirveyseh 如果我们想比较没有容错的浮点数,那么可以,我们可以将它们转换为整数并进行异或运算。
  • @amirveyseh Bitwise-XOR 在固定精度浮点数上定义良好。它在技术上也被定义为实数,但在复杂性理论的背景下,这种操作通常不被认为是O(1)
  • 所以我想如果我迭代原始数组并找到最多的浮动数字,然后将所有成员乘以这个,那么我可以使用整数异或吗?我的意思是例如在 (2.3,2,3.34,4.023) 我们将其转换为 (2300,2000,3340,4023)
  • @amirveyseh 您可以将浮点数的内存表示形式解释为整数。
猜你喜欢
  • 2013-05-17
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多