演算法理解
獲取陣列中第乙個空閒的塊
比如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...