【问题标题】:Efficient way of comparing value in array to all values before in array将数组中的值与数组中的所有值进行比较的有效方法
【发布时间】:2015-05-17 20:26:36
【问题描述】:

我有一个很长的数组 numbers[]。我的算法需要找到 numbers[] 中的最低索引 j,其中 |numbers[j] - numbers[i]| <= x(随机变量)或 |numbers[j] - numbers[i]| >= m - x(m 另一个变量,大于 x)和 i<j

这是我现在的算法:

 for (int j = 1; j < numbers.Length; j++)
 {
     for (int i = 0; i < j; i++)
     {
        long diff = Math.Abs(numbers[j] - numbers[i]); 
        if (diff <= x || diff >= m - x)
            return j;
     }
 }

这可以更有效地完成吗?例如,输入非常大的数字,我的笔记本电脑大约需要 36 秒。

【问题讨论】:

  • 这不包含在解释|| diff &gt;= m - x
  • 除了Int32.MaxValue的隐含限制之外,数字和x是否有上限?
  • x最大可以是1000万,其他值(在数组中)最大可以是1000亿。
  • 只是好奇,算法的目的是什么?您如何处理j 索引?为什么不同时返回i
  • 你可以对数组进行排序吗?

标签: c# arrays performance algorithm


【解决方案1】:

您可以在 O(nlogn) 中通过遍历数组并在每个阶段将新数字添加到平衡搜索树中来做到这一点。

当您添加号码时,您首先在搜索树中搜索最接近的号码。如果这个数字小于目标差值,那么您已经找到了答案。

【讨论】:

  • 平衡的搜索树有点太多的代码添加到答案中,但我找到了一个合理的实现here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多