Fibonacci二叉树的形成

Fibonacci二叉树的形成

1.以数据个数N来决定Fibonacci为K阶(k-order)

j=0 Fib(0)=0

j=1 Fib(1)=1

j=2 Fib(2)=1

j=3 Fib(3)=2

j=4 Fib(4)=3

……

j=N Fib(N)= Fib(N-1)+Fib(N-2)

设计一最小的k值,使得Fib(k+1)>N+1

2.K=0或k=1则表示Fibonacci只有一个结点,其余别无它物。

3.k>=2,则表示Fibonacci的根为Fib(k),左子树为(k-1)阶Fibonacci树(其根为Fib(k-1),右子树为(k-2)阶Fibonacci树(其根为Fib(k)+Fib(k-2)),上面的算法适用于N+1值为Fibonacci树,若N+1不为Fibonacci树,则找出M使得Fib(k)

Fibonacci差值原则

(1)左子树为负,右子树为正。

(2)如图所示:

步骤:

假设数据个数有n个且n比某一Fibonacci数小,满足下列的运算式,如下所示:

Fa>=n+1

则Fa-1就是这棵Fibonacci树的树根,而Fa-3则是开始的差值。如果我们要查找一个值key。首先我们比较数组索引和key,而得到下列的三种情况,如下所示:

1. 当key比较小,则我们查找1到Fa-1-1的数据。

2. 当key比较大,则我们查找Fa-1+1到Fa-1的数据。

3. 当key与数组索引Fa-1的值相等,表示查找成功。

4. 继续上述的步骤直到找到键值或Fibonacci树的差值为零。


fib[]={0,1,1,2,3,5,8,13,21,34,……}

int fib_search(int n,int key)
{ int index,mid fn1,fn2,temp;

for(index=0; fib[index]

mid=fib[index-1];

fn1=fib[index-2];

fn2=fib[index-3];

while(mid!=0){

if(key

if (fn2<=0)

mid=0;

else{

mid=mid-fn2;

temp=fn1;

fn1=fn2;

fn2=temp-fn2;}

}

else if(key>data[mid-1].key)

if(fn1<=1)

mid=0;

else{

mid=mid+fn2;

fn1=fn1-fn2;

fn2=fn2-fn1;}

else

return --mid;

}

return -1;

}

原始数据:34 16 27 9 75 42 82 95

排序后的数据:

d[1] d[2] d[3] d[4] d[5] d[6] d[7] d[8]

9 16 27 34 42 75 82 95

利用算法规则,生成斐波那契树,如图所示:

比如要查找key=34,此时从树根开始比较:

(1) 当key>树根时,往右子树根开始比较;

(2) 当key<树根时,往左子树根开始比较;

(3) 当key=树根时,表示数据找到。

过程如下:

(1) key=34<82,往左子树查找->第一次;

(2) key=34<42,往左子树查找->第二次;

(3) key=34>27,往右子树查找->第三次;

(4) key=34,数据找到->第四次。

共查找四次

效率:

斐波那契查找与折半查找的时间复杂度间同为O(log2(log2n)),平均情况下,斐波那契查找优于折半查找,但最坏情况下则差于折半查找。斐波那契查找优点是只有加、减运算。折半查找有除法运算。缺点是每次必须计算下个级数。


你可能感兴趣的:(算法,search,算法)