【问题标题】:Sort array removing minimum number of elements排序数组删除最小数量的元素
【发布时间】:2018-03-12 21:26:34
【问题描述】:

我正在尝试解决以下问题:

  1. 我有一个包含数千条记录的大型数组。
  2. 我想得到一个按降序排列的数组。但我不能 重新排序元素。我只能删除元素,或填充元素 空。
  3. 其余元素(未删除)应形成一个数组 降序。
  4. 条件是我必须删除最小记录数并在结果数组中获取最大记录数。

知道如何解决它吗?最大递减子序列将不起作用,因为我可以从数组内的任何位置删除元素。不只是两个方面。

【问题讨论】:

  • 您需要搜索“最长递减序列”。这些算法将解决您的问题;不在该序列中的任何内容都会被删除。
  • @Prune... 非常感谢您的回复。但是最长的递减序列可以删除可以通过删除一些中间值来排序的序列。在我的情况下,可以从序列内部删除点。不只是双方。
  • 最大递减序列还包括删除内部元素。您可能会想到“切片”,而不是“序列”。
  • 维基百科中的文章标题为“最长递增子序列”,但您应该能够将其调整为“递减”。
  • @Prune 和 user3386109 非常感谢:)。

标签: algorithm sorting data-structures


【解决方案1】:

来自 Prune 和 user3386109 的 cmets 和 Prune 我使用 PHP 以这种方式解决了它。

我使用 PHP 从Wikipedia 获取算法,稍作修改。

function longest_decreasing_subsequence($x) {
  $p = array();
  $m = array();
  $p = array_pad($p, count($x), null);
  $m = array_pad($m, count($x) + 1, null);
  $l = 0;
  for ($i = 0; $i < count($p); $i++) {
    $lo = 1;
    $hi = $l;
    while($lo <= $hi) {
      $mid = ceil(($lo + $hi) / 2);
      if($x[$m[$mid]] > $x[$i]) {
        $lo = $mid + 1;
      }
      else {
        $hi = $mid - 1;
      }
    }
    $newL = $lo;
    $p[$i] = $m[$newL - 1];
    $m[$newL] = $i;

    if($newL > $l) {
      $l = $newL;
    }
  }

  $s = array();
  $s = array_pad($s, $l, null);
  $k = $m[$l];
  for($i = $l - 1; $i >= 0; $i--) {
    $s[$i] = $x[$k];
    $k = $p[$k];
  }
  return $s;
}

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 2015-12-23
    • 2019-04-09
    • 1970-01-01
    • 2015-11-19
    • 2021-12-06
    • 2021-10-01
    • 2012-10-31
    相关资源
    最近更新 更多