資料結構與演算法 陣列(一)

2021-08-07 12:14:12 字數 3066 閱讀 9485

資料結構與演算法是計算機發展的基石,現代計算機的起源是數學,數學的核心是演算法,計算機歷史上每一次大的變革都離不開演算法的推動。縱然「條條大路通羅馬」,但好的演算法永遠比提高硬體裝置管用。

在排序陣列中,找出給定數字出現的次數。如,【1,2,2,2,3】中2出現的次數是3次。。。

簡單粗暴的方法是從頭到尾遍歷一遍,用個計數器進行計數,統計2出現的次數。

優化方法:該問題在二分查詢的基礎上進行改進。設陣列array為遞增序列,需要查詢的元素為finddata,為了求解給定數字出現的次數,可以分別尋找finddata在array中最先出現的位置和最後出現的位置,通過兩者的算術運算即可獲得該數字的出現次數。編碼的時候,用變數last來儲存本次查詢到的位置,然後根據情況變換查詢方向,就可以分別確定最先出現的位置的下標left和最後出現的位置下標right的值。

#includeusing namespace std;

int binarysearch( int *a, int length, int num, bool isleft )

else

if( a[mid] > num )

else

}return last>0 ? last : -1;

}int main()

; int lower = binarysearch( data,sizeof(data)/sizeof(data[0]),3,true );

int upper = binarysearch( data,sizeof(data)/sizeof(data[0]),3,false);

int count = upper - lower + 1;

cout << count << endl;

return 0;

}

如,兩個含有n個元素的有序(非降序)整型陣列a和b(陣列a和b中都沒有重複元素),求出其共同元素。 

a = 0 , 1 , 2, 3, 4 

b = 1, 3, 5, 7, 9 

交集為。

計算陣列交集可以採用很多種方法,但陣列的相對大小一般會影響演算法的效率,所以需要根據兩個陣列的大小來確定採用的方法。。

(1)對於兩個陣列長度相當的情況,一般可以採取以下3種方法。

(2)對於兩個陣列長度相差懸殊的情況,如果陣列a的長度遠遠大於陣列b的長度,則可以採用下面幾種方法。

例如,陣列 ,元素1出現的次數為兩次,元素2出現的次數為2次,元素4出現的次數為4次,元素5出現的次數為兩次,元素6出現的次數為3此,問題就是要找出出現重複次數最多的數,所以輸出應該為元素4.可以採用如下的兩種方法來計算陣列中重複次數最多的數。

(1)以空間換時間,定義乙個陣列int count[max],並將其陣列元素都初始化為0,然後執行for( int i=0;i<100;i++ ) count[a[i]]++;操作,在count中找最大的數,即為重複次數最多的數。

(1)是一種典型的空間換時間的演算法。一般情況下,除非記憶體空間足夠大,否則一般不採用這種方法。

(2)使用map對映表,通過引入map表(map是stl的乙個關聯容器,它提供一對一的資料處理能力,其中第乙個為關鍵字,每個關鍵字只能在map中出現一次,第二個稱為該關鍵字的值)來記錄每乙個元素出現的次數,然後判斷次數大小,進而找出重複次數最多的元素。

#include

#include

using

namespace

std;

bool findmostfrequentinarray( int *a, int size, int &val )

return

true;

}int main()

; int val = 0;

if( findmostfrequentinarray( a,11,val ) )

cout

<< val << endl;

return

0;}

如果本題對時間複雜度沒有要求,可以採用很多方法。

但由於本題對時間複雜度有要求,以上方法顯然都達不到要求,不可取,需要採取非常規方法,利用一些其他技巧來實現。

#include

using

namespace

std;

else

}return candidate;

}int main()

; int len = sizeof(arr)/sizeof(arr[0]);

cout

return

0;}

#includeusing namespace std;

int main()

;a = a[5];

b = 0

; for( i=0

;i<10; i++ )

else

if( a== a[i] )

else

if( a!=a[i] )

}cout << a

return0;

}

陣列a[n], 1至n-1這n-1個數存放在a[n]中,其中某個數重複一次,寫乙個函式,找出被重複的數字。要求每個陣列元素只能訪問一次,不能用輔助儲存空間

由於題目要求每個陣列元素只能訪問一次,不用輔助儲存空間,可以從原理上入手,採用數學求和法,因為只有乙個數字重複一次,而數又是連續的,根據累加和原理,對陣列的所有項求和,然後減去1至n-1的和,即為所求的重複數。

如果題目沒有要求每個陣列元素只能訪問一次,不用輔助儲存空間,還可以用異或法和位圖法來求解。

位圖法的原理是首先申請乙個長度為n-1且均為『0』組成的字串,然後從頭開始遍歷陣列a[n],取每個陣列元素a[i]的值,將其對應的字串中的相應位置置1,如果已經置1,那麼該數就是重複的數。由於採用的是位圖法,所以空間複雜度比較大,為o(n)。

此題進行乙個變形:取值為【1,n-1】含n個元素的整數陣列,至少存在乙個重複數,即可能存在多個重複數,o(n)時間內找出其中任意乙個重複數。例如,array【】= ,則2和4均是重複元素。

資料結構與演算法 陣列

陣列是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。其中有幾個重要的概念 非線性表 連續的記憶體空間 儲存相同型別的資料 如圖所示,這是乙個長度為5的int陣列arr,我們假設起始的記憶體位址為1000,那麼第乙個元素的記憶體位址範圍就是 1000 1003,這是因為乙...

資料結構與演算法 陣列

題型1 如何用遞迴實現陣列求和 方法1 題型2 如何用乙個for迴圈列印乙個二維陣列 方法1 array在二維陣列中的行號和列號分別為 i maxy i maxy 題型3 用遞迴和非遞迴的方法實現二分查詢 題型4 如何在排序陣列中,找出給定數字出現的次數 方法1 二分查詢,分別找出左邊界和右邊界,左...

資料結構與演算法 陣列

陣列是由相同型別的元素 element 的集合所組成的資料結構,分配一塊連續的記憶體來儲存。利用元素的索引 index 可以計算出該元素對應的儲存位址。維基百科 陣列是線性表資料結構,定義陣列時,系統會分配乙份連續的記憶體空間來儲存一組相同的型別的資料,如int num n 陣列定義為一維陣列 二維...