[英]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)操作。 您可以執行以下操作。
繼續將array1 [j]復制到array1 [j-count]。
array1 [j-count] = array1 [j];
繼續直到array1的末尾。 最后,將array1的大小調整為size size - count
。
您未指定語言。 我將合並數組,將它們設為集合,然后再次對結果進行排序。
set combined_set = new Set(array1 + array2)
array = new Array(combined_set).sort()
這可以通過對array1[]
和delete[]
進行兩步掃描來完成。
同時掃描這兩個數組,並記住array1[]
的位置,其值也出現在delete[]
。
根據您在第一步中獲得的位置,您應該知道,對於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.