二分查詢的變形應用

2021-05-01 12:48:54 字數 2074 閱讀 8568

演算法理解

獲取陣列中第乙個空閒的塊

比如array

為1111111…111000000…0

問題就變成

尋找array

中第乙個出現的0

演算法一:遍歷陣列找到第乙個

0 o(n)

演算法二:二分查詢

二分查詢成功條件

:array[i]=t;

失敗條件:

l>u

對於本問題來說,成功條件則是

array[i]=0 array[i-1]=1,

失敗條件要提前測試全1

的情況static int _getblockffp() ;

int i,j;

for(j=0;j<=size;j++)

for(i=0;i

array[i]=1;

//讀第0頁

if(array[0]==0)

else

//讀最後一頁

if(array[size-1]==1)

else

//以上處理了

全空全滿,不存在

first free page

的情況//

以下則是非0

最後一頁

肯定存在

first free page

的情況while(1)

else

*/if(array[npage]==0)

nminfree=npage-1; }

else

nmaxused=npage+1;

}/* if( (nminfree == (nmaxused+1 )))

*/} }

} 演算法三:

二分查詢的變形,每次迴圈少一次

訪問陣列

利用兩個變數

nminfree nmaxused

,演算法成功條件

nminfree== nmaxused+1

version 1

:邏輯清晰版

#define size 64

static int _getblockffp() ;

int i,j;

for(i=0;i<56;i++)

array[i]=1;

//讀第0頁

if(array[0]==0)

else

//讀最後一頁

if(array[size-1]==1)

else

//以上處理了

全空全滿,不存在

first free page

的情況//

以下則是非0

最後一頁

肯定存在

first free page

的情況while(1)

else

if( (nminfree == (nmaxused+1 )))}

} version 2

:更加優化版

#include

#include

#define size 64

typedef unsigned char byte;

static int _getblockffp()

;int i,j;

int l,u;

l=0;

u=size-1;

for(i=0;i<56;i++)

array[i]=1;

while(1) /*

未確定,

重新定位,先算

case

減半*/

npage = (byte)((nminfree + nmaxused) >> 1);

printf("free blk/n");

printf("nminfree : %d,nmaxused : %d/n",nminfree,nmaxused);

printf("ncase : %d,newnpage : %d/n",ncase,npage);

printf("/n"); }

else

/*未確定

,重新定位,減半

*/if(0==npage)

else}}

}

變形二分查詢

title 資料結構與演算法 專案 主題 二分查詢 description 分析 1 查詢的是乙個有序的資料集合 2 每次查詢都是與區間的中間元素進行對比,將待查詢的區間縮小為之前的一半,直到找到要查詢的元素,或者區間被縮小為0 date 2021 version 0.1版本 author coff...

二分查詢及其變形

一 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。方法一 o n public int minnumberinrota...

二分查詢及其變形

最基本的二分查詢模版 在有序陣列a中查詢key,如果找到,返回位置索引,否則,返回 1 int binarysearch int a,int n,int key else if a mid key else return 1 變種1 如果a有多個key元素,返回最大的,否則,返回 1 int bin...