删除和移位数组元素

时间:2013-12-22 16:04:06

标签: arrays algorithm sorting language-agnostic

假设我有2个排序数组。其中一个具有要从另一个中删除的元素。 例如

  int array1[]={1,2,3,4,5,6,7,8,9,10,11,12,13};
  int delete[]={5,9,12};

如何从array1中删除delete数组中指示的元素,并有效地将其余部分移到array1中?

我不想遍历array1的所有元素,因为其中一些元素将保持不变。所以我想从

开始
  int j,i=0,n=0;
  for(j=delete[i+n];j<delete[i+1+n];j++){
      array1[i-n]=array1[i+1-n];
      n++;
  }

但我无法弄清楚如何正确行事。有什么想法吗?

5 个答案:

答案 0 :(得分:1)

从数组中删除任何元素是O(N)操作。您可以执行以下操作。

  1. 初始化i = 0.count = 0.
  2. 遍历array1 []并搜索元素delete [i]。
  3. 如果遇到元素array1 [j]&gt; delete [i],这意味着array []中不存在delete [i]。增加i以检查删除数组中的下一个元素。
  4. 如果找到元素array1 [j] == delete [i],则递增计数。并增加我。
  5. 继续将array1 [j]复制到array1 [j - count]。

    array1 [j - count] = array1 [j];

  6. 继续直到array1的结尾。最后,将array1的大小调整为size - count

答案 1 :(得分:0)

您没有指定语言。我将组合数组,使它们成为一组并再次对结果进行排序。

set combined_set = new Set(array1 + array2)
array = new Array(combined_set).sort()

答案 2 :(得分:0)

这可以通过array1[]delete[]的两步扫描完成。

  1. 同时扫描这两个数组并记住array1[]delete[]的值也显示在array1[]中的位置。

  2. 根据您在第一步中获得的排名,对于delete[]中的每个值,您应该知道从{{1}}删除值后的位置。然后只需复制到正确的位置。完成!

  3. 所有过程都可以在 O(n)

    中完成

答案 3 :(得分:0)

假设这样的声明:

var
   TgtArr : array of integer; // given- sorted array of elements to be modified
   TgtArrLen : integer;       // given- count of elements in TgtArr
   DelArr : array of integer; // given- sorted list of elements to be deleted
   DelArrLen : integer;       // given- count of elements in DelArr

并声明这些工作变量:

var PutPtr, GetPtr, DelPtr : integer;  // local to deletion operation

此片段将完成删除:

   DelPtr := 0;
   PutPtr := 0;
   for GetPtr := 0 to TgtArrLen-1 do begin
      if TgtArr[GetPtr]<>DelArr[DelPtr] then begin
         TgtArr[PutPtr] := TgtArr[GetPtr];
         PutPtr := PutPtr+1;
      end;
      if TgtArr[GetPtr]>=DelArr[DelPtr] then begin
         DelPtr := DelPtr+1;
         if DelPtr>=DelArrLen then break; // out of "for GetPtr" loop
      end;
   end;
   TgtArrLen := PutPtr;

(这是Delphi Pascal,但你明白了。)

答案 4 :(得分:0)

如果您不想更改数据结构,我们可以简单地使用两个

  

二元搜索

搜索要删除的元素的下限上限。例如 数组{1,1,2,2,3,3,3,4,5}和删除元素是3,所以我们有起始索引和结束索引是4和6。

下一步非常简单,只需折叠上述两个索引指定的段。

如果您希望获得更快的性能,我建议您使用二进制搜索树,或使用存储频率元素的数组。