演算法學習 6 尋找最小的k個,

2021-07-11 00:16:36 字數 2407 閱讀 1546

1、輸入n個整數,輸出其中最小的k個。

思路1:先快速排序,然後取前k個數。時間複雜度:o(n * log n)+o(k)=o(n * log n)。

思路2:a)定義乙個長度為k的陣列result,將前k個整數放入result;

b)採用選擇或交換排序找到result陣列的最大值max;

c)依次遍歷後n-k個整數,若其》max,說明其不是最小k個數之一並跳過,若其

這種演算法最差情況下的時間複雜度:o(k)+(n-k)*o(k)=o(n*k)

思路3:a)選擇乙個數pivot將陣列分成兩部分sa和sb,使得sa的元素都小於等於pivot,sb的元素都大於pivot;

b)如果k

c)如果k=sa元素個數,則sa中元素就是最小的k個元素,

d)如果k>sa元素個數,則返回sa中所有元素和sb中(k-|sa|)個元素,即遞迴sb。

這種平均時間複雜度:o(n*logk),二分法!

思路1**如下:

public class codefour;

mysort(num,0,num.length-1);

int k = 3;

for(int i=0;iarr[right])

swap(arr,left,right);

return;

} int i = left;

int j = right;

int pivot = arr[i];

while(leftpivot&&left

思路2**如下:

public class codethree;

int k = 3;

mink(arr,k);

} public static void mink(int arr, int k)

} public static void swap(int arr, int index1, int index2)

}

思路3**如下:

public class codeone;

int k = 3;

mink2(arr,0,arr.length-1,k);

} public static void mink2(int arr, int left, int right,int k)if(i-left+1

2、兩個公升序序列a=(a1,...,ak)和b=(b1,...,bk),求k個最小的(ai+bj),其中1

思路1:兩個陣列相加得到k*k個數,轉變成求新陣列的k個最小值的問題;

時間複雜度:o(k*k)+(k*k)*o(k)=o(k*k*k)

思路2:a)找到最小的整數n,滿足n*(n+1)/2>=k;

b)若n*(n+1)/2=k,則滿足 i+j<=n 的n*(n+1)/2個數(arr1[i]+arr2[j])即為所求,輸出結果程式結束;

c)若n*(n+1)/2>k,則滿足 i+j<=n-1 的

(n-1)*n/2個數屬於所求,另外(

k-(n-1)*n/2

)個結果在

滿足 i+j=n 的

n個數中;

d)求滿足 i+j=n 的

n個數中最小的(

k-(n-1)*n/2

)個數,即上文題1

。採用快速排序方法下的時間複雜度:o(sqrt(k))+o(sqrt(k) * logsqrt(k))= o(sqrt(k)* log 

sqrt(k))

對上述演算法解釋一下,因為

自己想到的,好得意,啊哈哈~歡迎打臉~~~

a、b兩個陣列中數兩兩相加可得k*k個數,形成乙個新的二維陣列 c[i, j] =a[i] +b[j],要求的就是陣列 c 中的k個最小值。因為陣列a、b是公升序序列,則一定有c[i, j]<=c[m, n],其中m+n>i+j。

以a=、b=為例,k=5,滿足n*(n+1)/2>=k的最小正整數為n=3,則最小的k個數一定在i+j

從上圖可以看出,在不計算陣列c中元素值的情況下,僅憑索引號可知越靠近左上角值越小,處於同一45°直線上(圖中以同一顏色標出)元素之間的大小必須通過計算才能得知。k個最小數也都在左上角,k=5,n=3,則屬於 i+j(n-1)*n/2個數一定屬於k個最小數,剩下的數都在滿足i+j = n-1的直線上,因此僅需要對該直線上的元素判斷即可。

思路2**如下:

public static void myfun(int arr1, int arr2, int k){

int n=1;

while(n*(n+1)/2

其他思路:最小堆(輔助陣列(

演算法學習 6

計數排序是假設陣列a中的元素都是在0到k區間內的整數。構建乙個陣列c 0,k 初始化為 1,如果陣列a中的元素互異的話,那麼把a的元素拷貝到c中 c a i a i 然後遍歷c,把非 1的元素依次拷貝到陣列a中即可完成排序。但陣列有元素相等要怎麼處理了。元素互異的做法,還可以是c 0,k 初始化為0...

k 鄰近演算法學習

coding utf 8 from numpy import import operator def createdataset group array 1.0,1.1 1.0,1.0 0,0 0,0.1 labels a b c d return group,labels def classify...

K 近鄰演算法學習

coding utf 8 from numpy import import operator def createdataset group array 1.0,1.1 1.0,1.0 0,0 0,0.1 labels a a b b return group,labels def classify...