簡體   English   中英

刪除和移動數組元素

[英]delete and shift array elements

假設我有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++;
  }

但是我不太清楚該怎么做。 有任何想法嗎?

從數組中刪除任何元素都是O(N)操作。 您可以執行以下操作。

  1. 初始化i =0。count = 0。
  2. 遍歷array1 []並搜索元素delete [i]。
  3. 如果遇到元素array1 [j]> delete [i],則意味着delete [i]在array []中不存在。 遞增i以檢查delete數組中的下一個元素。
  4. 如果找到元素array1 [j] == delete [i],則增加計數。 並增加i。
  5. 繼續將array1 [j]復制到array1 [j-count]。

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

  6. 繼續直到array1的末尾。 最后,將array1的大小調整為size size - count

您未指定語言。 我將合並數組,將它們設為集合,然后再次對結果進行排序。

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

這可以通過對array1[]delete[]進行兩步掃描來完成。

  1. 同時掃描這兩個數組,並記住array1[]的位置,其值也出現在delete[]

  2. 根據您在第一步中獲得的位置,您應該知道,對於array1[]每個值,從delete[]刪除值之后應該處於哪個位置。 然后將其復制到正確的位置。 完成!

所有過程都可以在O(n)中完成

假設這樣的聲明:

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,但您明白了。)

如果您不想更改數據結構,我們可以簡單地使用兩個

二進制搜索

搜索的下限上限要刪除的元素。 例如數組{1,1,2,2,3,3,3,4,5}和deleteing元素是3,所以我們有開始索引,結束索引是4和6。

下一步是如此簡單,只需折疊上述兩個索引指定的段即可。

如果要提高性能,建議您使用二進制搜索樹或存儲元素頻率的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM