題目:給定乙個具有n個元素的實數集a,乙個實數t,乙個整數k,請問如何快速的確定該實數集中是否存在乙個具有k個元素的子集,其所有元素之和小於等於t?
對於這個問題,我首先想到的是排序,只要找到實數集中最小的k個元素,問題也就解了。但對於完全的排序而言實際上是沒有必要的,我們只需要確定最小的k個元素就行了。於是我又想到了快排,它的分治思想用在這裡是再合適不過了,我們只需對快排作一些改造可以得到乙個很好的解決方案。
int partition(double *set, int n)
set[low] = p;
return low;
}int sum(double* set, int n)
void print(double* set, int n)
int verify(double *set, int n, int k, double t)
else
return 0;
}else
else
return 0;}}
else
return verify(set, m, k, t);
}
實際上,認真分析,會發現這裡存在著乙個問題,題目中給定的是實數集,因此,就存在t為負的情況。在這種情況下,我們可能會求出這樣乙個子集a1,其所有元素之和大於t,但乙個包含a1的另乙個子集a2,其所有元素之和可能反而小於t。例如:a = , t = -9, a1 = , a2 = . 這樣一來,我們在line48判斷s<=t時就會失敗從而函式返回假。
解決這個問題的辦法就是當t<0時,將t和實數集a中的所有元素都取負,然後問題就轉化成了:給定乙個具有n個元素的實數集a,乙個實數t(t>0),乙個整數k,請問如何快速的確定該實數集中是否存在乙個具有k個元素的子集,其所有元素之和大於t。然後使用類似的思想,問題也就解決了。
python實現快排演算法 python快排演算法詳解
快排是python經典演算法之一。1 下面講解的是什麼是快排和快排的圖示。2 快排是一種解決排序問題的運算方法。3 快排的原理 在陣列中任意選擇乙個數字作為基準,用陣列的資料和基準資料進行比較,比基準數字打的數字的基準數字的右邊,比基準數字小的數字在基準數字的左邊,第一次排序之後分為比基準資料大或比...
2011 4 15 快排演算法,堆排演算法
template int get pivot index value type array,int start,int end value type pivot array start while start end while startpivot end array start array en...
排序演算法 快排
今天聊聊排序演算法,排序演算法平時也會用到,有很多比如,冒泡,快排,選擇,歸併排序等 今天就聊一聊快速排序演算法排序演算法的乙個宗旨就是經過一趟排序,何為一趟排序呢?就是遍歷完一次陣列,陣列中的一部分資料比另外一部分的資料都要小 當然這兩部分資料內部仍然是無序的,然後我們再對這兩部分資料分別進行排序...