陣列擴容 無序陣列

2021-10-01 22:26:48 字數 4072 閱讀 2744

靜態空間管理:開闢內部陣列並適用一段位址連續的物理空間,capacity為總容量,size為當前的實際規模。若採用靜態空間策略管理,容量capacity固定,則存在明顯的不足。

上溢:capacity空間不夠,不足以存放所有元素

下溢:capcity空間過大,存放的元素寥寥無幾,裝填因子(load factor) u=size/capacity << 50%

而在一般的環境種無法**空間的需求量,因此需要進行動態的擴容

public

class

linearrecur

;int

a =;}

public

static

int[

]copyfrom

(int

array,

int low,

int high)

return newarray;}}

<

/pre>

2.動態空間管理的思想:在即將發生上溢時,適當的擴大內部陣列的容量。主要有兩種擴容策略:

a. 第一種為容量遞增策略:即每次在即將上溢時,給系統增加固定的容量。

b. 第二種為容量加倍策略:即在每次即將上溢時,在系統容量的基礎上容量加倍。

兩種增容演算法的效能如下圖所示:

元素訪問

元素插入: 由於我們這裡採用的是用陣列進行元素插入,因此在插入之前我們需要先對陣列進行擴容,再插入

public

class

linearrecur

;int

newarray;

newarray =

insert

(b,1

,100);

for(

int j =

0; j < newarray.length; j++)}

public

static

int[

]insert

(int

array,

int rank,

int num)

newarray[rank]

= num;

return newarray;

}public

static

int[

]copyfrom

(int

array,

int low,

int high)

return newarray;}}

<

/pre>

3.區間刪除: 刪除[low,high)中的元素

public

class

linearrecur

;int

newarray;

newarray =

delete

(b,1,3

);for(

int j =

0; j < newarray.length; j++)}

public

static

int[

]delete

(int

array,

int low,

int high)

while

(high < array.length)

while

(low < array.length)

return array;}}

<

/pre>

4.刪除:單元素刪除操作:

可以通過呼叫區間刪除操作來實現:remove = delete[rank,rank+1),刪除的區間只包含乙個元素

但是區間刪除,不能夠呼叫單個刪除來實現,因為這樣會導致時間複雜度變為o(n^2)

5.查詢:查詢某一指定元素

public

class

linearrecur

;int index =0;

index =

find

(b,0,3

,5);

system.out.

println

(index);}

public

static

intfind

(int

array,

int low,

int high,

int num)

}return high;}}

<

/pre>

6.唯一化:刪除陣列中的重複元素

public

class

linearrecur

;int

array;

array =

unique

(b);

for(

int i =

0; i < array.length; i++)}

public

static

int[

]unique

(int

array)

else

if(array[i]==0

)else

}return array;

}public

static

intfind

(int

array,

int low,

int high,

int num)

}return high;

}public

static

int[

]delete

(int

array,

int low,

int high)

while

(high < array.length)

while

(low < array.length)

return array;}}

e(high < array.length)

while

(low < array.length)

return array;}}

<

/pre>

有序/無序序列中,任意。/總有一對相鄰元素順序/逆序

相較於無序陣列的唯一化,有序陣列的唯一化可以有更加簡單的實現形式。之前唯一化演算法的低效在於對於同一元素作為被刪除元素的後繼需要進行多次前移,這就導致無序陣列的唯一化具有低效的效能。而有序陣列若能以區間為單位,刪除重複元素勢必將大大提高演算法的效能,同時有序陣列無需向前查詢,這也是演算法提高效能的乙個方面。下面是有序陣列唯一化的實現過程。

無序陣列 的特殊排序

分析 對於一般陣列的排序顯然 o n 是無法完成的。既然題目這樣要求,肯定原先的陣列有一定的規律,讓人們去尋找一種機會。例如 原始陣列 a 10,6,9,5,2,8,4,7,1,3 如果把它們從小到大排序且應該是 b 1,2,3,4,5,6,7,8,9,10 也就是說 如果我們觀察 a b 的對映關...

無序陣列的中位數

題目 求出乙個無需陣列的中位數。例 的中位數為5,的中位數為4和5。要求 不能使用排序。思路1 將資料平均分配到最大堆和最小堆中,並且保證最小堆中的資料存放的資料都比最大堆中是資料大,那麼此時最小堆堆頂的元素一定是中位數。那麼如何保證最小堆中的元素,都比大堆中的元素大 1 遍歷陣列,將第i個數插入堆...

無序陣列求中位數

長度為 n 的無序陣列,求中位數,如何盡快的估算出中位數,演算法複雜度是多少?如果陣列中元素有奇數個,可以採用這種演算法 步驟 1 可以將陣列的前 n 1 2 個元素,建立 1 個最小堆 步驟 2 遍歷剩餘元素,如果剩餘元素小於堆頂元素,則丟棄或不作處理 如果剩餘元素大於堆頂元素,則將其取代堆頂元素...