二分查找--AVL查找树
生活随笔
收集整理的這篇文章主要介紹了
二分查找--AVL查找树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Data Mining
開啟閱讀模式二分查找--AVL查找樹
二分查找可以找到元素在數組中的下標位置,而查找樹由于采用的是樹結構,所以只能判斷出元素是不是在樹中以及給出最大/小值,而不能確定指定元素的確切位置。
二分查找
#include<vector>#include<iostream>#include<algorithm>#include<cstdlib>#include<iomanip> //cout格式化輸出#include<ctime>using namespace std;const int NOT_FOUND=-1;const long MUL=16807L; const long ADD=13849; const long MOD=0x7fffffffL; //線性同余法產生無符號隨機數inline unsigned myRand(){static long seed=(long)time(NULL);seed=(seed*MUL+ADD)%MOD;return (unsigned)seed>>17; //linear congruential method高16位隨機性比較好,我們只用它的高15位,返回值在[0,32767]}template <typename Comparable>int binarySearch(const vector<Comparable> & a,const Comparable & x){int low=0;int high=a.size()-1;while(low<=high){int mid=(low+high)/2;if(x>a[mid])low=mid+1;else if(x<a[mid])high=mid-1;elsereturn mid;}return NOT_FOUND;}int main(){clock_t begin=clock();vector<int> v;for(int i=0;i<1000000;i++)//生成一百萬個隨機數進行排序v.push_back((int)myRand()); sort(v.begin(),v.end());int position=binarySearch(v,20109);clock_t finish=clock();long elapse=(long)(finish-begin);cout<<"find the element in position: "<<position<<endl;cout<<"elapsed time:"<<setprecision(5)<<(float)elapse/CLOCKS_PER_SEC<<"s"<<endl;return 0;}?
clock_t的值轉換為秒應該是除以CLOCKS_PER_SEC這個宏,而這個宏在Windows平臺下是1000,而到了Linux平臺下就是1000000了
?
AVL查找樹
#include<iostream> #include<iomanip>using namespace std;const long MUL=16807L; const long ADD=13849L; const long MOD=0x7fffffffL; //線性同余法產生無符號隨機數inline unsigned myRand(){static long seed=(long)time(NULL);seed=(seed*MUL+ADD)%MOD;return (unsigned)seed>>17; //linear congruential method高16位隨機性比較好,我們只用它的高15位,返回值在[0,32767]}//定義平衡二叉樹struct AvlNode{int element;AvlNode *left;AvlNode *right;int height;AvlNode(const int & theElement,AvlNode *lt,AvlNode *rt,int h=0):element(theElement),left(lt),right(rt),height(h){}};//計算節點的高度int height(AvlNode * t){return t==0?-1:t->height;}//返回兩個整值的最大者int max(const int l,const int r){if(l>r)return l;elsereturn r;}//左旋void rotateWithLeftChild(AvlNode * & k2){AvlNode *k1=k2->left;k2->left=k1->right;k1->right=k2;k2->height=max(height(k2->right),height(k2->left))+1;k1->height=max(height(k1->left),k2->height)+1;k2=k1;}//右旋void rotateWithRightChild(AvlNode * & k2){AvlNode *k1=k2->right;k2->right=k1->left;k1->left=k2;k2->height=max(height(k2->left),height(k2->right))+1;k1->height=max(height(k1->right),k2->height)+1;k2=k1;}//左--右旋void doubleWithRightChild(AvlNode * & k3){rotateWithLeftChild(k3->right);rotateWithRightChild(k3);}//右--左旋void doubleWithLeftChild(AvlNode * & k3){rotateWithRightChild(k3->left);rotateWithLeftChild(k3);}//插入新節點void insert(const int & x,AvlNode * & t){if(t==0)t=new AvlNode(x,0,0);else if(x<t->element){insert(x,t->left);if(height(t->left)-height(t->right)==2){if(x<t->left->element)rotateWithLeftChild(t);elsedoubleWithLeftChild(t);}}else if(x>t->element){insert(x,t->right);if(height(t->right)-height(t->left)==2){if(x>t->right->element)rotateWithRightChild(t);elsedoubleWithRightChild(t);}}else;//Duplicate;Do nothingt->height=max(height(t->left),height(t->right))+1;}//判斷樹中是否包含要查找的節點bool contains(const int & x,AvlNode * t){if(t==0)return false;else if(x<t->element)return contains(x,t->left);else if(x>t->element)return contains(x,t->right);elsereturn true;}int main(){clock_t begin=clock();AvlNode * root=new AvlNode(0,0,0);for(int i=0;i<1000000;i++)//生成一百萬個隨機數進行排序insert((int)myRand(),root);if(contains(20109,root))cout<<"find"<<endl;elsecout<<"not find"<<endl;clock_t finish=clock();long elapse=(long)(finish-begin);cout<<"elapsed time:"<<setprecision(5)<<(float)elapse/CLOCKS_PER_SEC<<"s"<<endl;return 0;}比較結果http://www.cnblogs.com/zhangchaoyang/articles/1808928.html
生成一百萬個隨機數,在我的機子上進行查找,運行10次的平均時間(建立存儲結構+查找時間):秒??http://www.cnblogs.com/zhangchaoyang/articles/1808928.html
| 二分查找 | 平衡二叉查找樹 |
| 0.67 | 1.11 |
http://www.cnblogs.com/zhangchaoyang/articles/1808928.html
總結
以上是生活随笔為你收集整理的二分查找--AVL查找树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二分查找树性能分析(Binary Sea
- 下一篇: 关于求N个无序数中第K大的数。