尋找第f小數的證明

2021-06-22 18:24:28 字數 752 閱讀 5732

在數列a[1...n] 中查詢第f小的數

演算法如下:

1任意選定乙個數r(比如說a[f]),然後將a[m...n]分成兩部分:

a[m],...a[k],a[k+1],...a[n]

並滿足 a[m],...,a[k]<=r a[k+1],a[n]>=r

2如果 f屬於[m,k],另n=k

3如果f屬於[k+1,n],另m=k+1

4如果 m=n=k,終止

次演算法將a[1,n]分成三部分

a[1,m-1]<=a[m,n]<=a[n+1,n]

步驟一:問題定義

*前條件:給定數列a[1...n],和1<=f<=n

*後條件:移動a使得a滿足

對於任意p,q(1<=p<=f<=q<=n 可推出a[p]<=a[f]<=a[q]) (found)

步驟二:尋找中間變數(不變數)

*定義中間變數m和n,滿足a[m]是中間部分第乙個元素,a[n]是中間部分最後乙個元素

*不變數的目的:

m<=f且對於任意p,q(1<=pf<=n 且對於任意p,q(1<=p<=n*決定m和n的初始值:

m=1,n=n

*檢查初始值是否滿足不變數

*定義遞增情況:

while m*該迴圈能否完成目標任務:迴圈終止時:

m-inv且n-inv且(m可推出 m==n==且對於任意p,q(1<=p<=f<=q<=n 可推出 a[p]<=a[f]<=a[q])  結論成立

*得到程式結構:

牛客 第k小數 線性尋找第 k 小數

題目大意 給出長度為 n 的數列 a 要求找到第 k 小的數 題目分析 因為資料給的足夠大,所以約束就是必須線性完成操作,stl 中的 nth element 函式可以完美實現操作,算是學到了一波,格式 nth element a.begin a.begin k a.end 那麼 a k 就是第 k...

陣列中的第k小數

描述 以盡量高效率求出亂序中的k小數 輸入 第一行 陣列長度 第二行 陣列元素 空格隔開 第三性 第幾小的數 輸出 第k小的數 樣例輸入 5 6 1 2 9 3 8 2樣例輸出 解題思路利用快速排序找到主元的位置,判斷主元是第幾小的 主元位置大了剪掉右邊的 主元位置小了剪掉左邊的 假設要找第三小的數...

尋找第K小的數

尋找第k小的數屬於順序統計學範疇,通常我們可以直接在o nlgn 的時間內找到第k小的數,使用歸併排序或者堆排序對輸入資料按從小到大進行排序,然後選擇第k個即可。然而,我們還有更好的演算法。首先來看乙個簡單的問題,在乙個有n個元素的集合中,需要多少次比較才能確定其最小值呢?這可以很容易退出需要n 1...