【问题标题】:Remove unsorted/outlier elements in nearly-sorted array删除接近排序数组中的未排序/异常值元素
【发布时间】:2015-11-19 22:04:24
【问题描述】:

给定一个像[15, 14, 12, 3, 10, 4, 2, 1] 这样的数组。如何确定哪些元素出现故障并删除它们(在本例中为数字 3)。我不想对列表进行排序,而是检测异常值并将其删除。

另一个例子:

[13, 12, 4, 9, 8, 6, 7, 3, 2]

我希望能够删除 #4 和 #7 以便我最终得到:

[13, 12, 9, 8, 6, 3, 2]

当你遇到这种情况时也会出现一个问题:

[15, 13, 12, 7, 10, 5, 4, 3]

您可以删除 7 或 10 以使该数组排序。

一般来说,我要解决的问题是,给定一个数字读数列表(有些可能会偏离很多)。我希望数组只包含遵循一般趋势线的值并删除任何异常值。我只是想知道是否有一种简单的方法可以做到这一点。

【问题讨论】:

  • 你能删除第一个满足:a[i] < a[i + 1] 的元素吗? (O(n))
  • 您要删除最少数量的元素,还是任意数量都可以?
  • 我喜欢@higuaro 的这个想法,但是我该如何处理多个异常值元素呢?
  • @PhamTrung 最低限度(如果可能)

标签: arrays algorithm sorting outliers trendline


【解决方案1】:

我会将您的问题简化为最长的递增(递减)子序列问题。

https://en.wikipedia.org/wiki/Longest_increasing_subsequence

由于您的序列几乎已排序,因此您一定会收到满意的结果(即整齐地遵循趋势线)。

有很多解决方案;其中之一在 Svetlin Nakov 和 Veselin Kolev 的免费书籍“Fundamentals of Computer Programming with C#”中被描绘;问题在第 257 页,练习 6 中提出;解决方案在第 260 页。

取自书中:

编写一个程序,找出数组 arr[n] 中递增元素的最大序列。不必连续放置元素。例如:{9, 6, 2, 7, 4, 7, 6, 5, 8, 4} -> {2, 4, 6, 8}。

解决方案:

我们可以用两个嵌套循环和一个数组 len[0…n-1] 来解决这个问题。在数组 len[i] 中,我们可以保留最长的连续递增序列的长度,该序列从数组中的某处开始(确切的位置无关紧要)并以元素 arr[i] 结束。因此 len[0]=1,len[x] 是最大和 max(1 + len[prev]),其中 prev

所描述的算法找到所有最大升序序列的长度,这些序列在每个元素处结束。这些值中最大的一个是最长递增序列的长度。如果我们需要找到组成最长序列的元素本身,我们可以从序列结束的元素开始(在索引 x 处),我们可以打印它,我们可以搜索前一个元素(prev)。根据定义 prev

【讨论】:

  • 我想就是这样!让我试试看。
【解决方案2】:

higuaro 描述的简单算法可以帮助您生成正确的序列:

对于索引i 处的每个元素,如果a[i] < a[i + 1],我们可以简单地删除该元素a[i]

for(int i = 0; i < size; i++)
    while(a[i] < a[i + 1]){
       remove a[i];
       i--;
    }

但是,这种方法不能保证移除元素的数量是最小的。例如,对于这个序列 [10, 9, 8, 100, 1, 0],移除 100 将是最优的,而不是移除 8,然后是 9,然后是 10。

要找到要删除的元素的最小数量,我们注意到我们需要找到最长的递减子序列,这类似于经典的longest increasing sub sequence,其解决方案已描述为here

【讨论】:

  • 我们为什么不删除 a[i+1] 呢?这将删除 100 这将是最佳的。所以代码是`for(int i = 0; i &lt; size; i++) while(a[i] &lt; a[i + 1]){ remove a[i+1]; i--; }
  • @NikhilJagdale 我们可以很容易地想出一个例子,这会使你的解决方案输出不正确的结果,例如这个序列[100, 99, 5, 98, 97, 96] -> 正确的解决方案是[100, 99, 98, 97, 96],你的输出是[100, 99, 5]
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 2022-10-05
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 2021-10-01
相关资源
最近更新 更多