資料結構與演算法是計算機發展的基石,現代計算機的起源是數學,數學的核心是演算法,計算機歷史上每一次大的變革都離不開演算法的推動。縱然「條條大路通羅馬」,但好的演算法永遠比提高硬體裝置管用。
在排序陣列中,找出給定數字出現的次數。如,【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 陣列定義為一維陣列 二維...