資料結構實驗8-二分查詢與二叉排序樹
實驗要求
用隨機數產生100個待查詢資料元素的關鍵字值。
測試下列各排序函式的機器實際執行時間:
(1)順序查詢
(2)二叉排序樹查詢
(3)折半查詢
提示:
(1)和(2)使用同樣的實驗資料;(3)要求資料元素必須有序,故需要先使用排序演算法進行排序(可以使用氣泡排序)
程式程式碼
#include <bits/stdc++.h>
#define nmax 100
#define maxtime 5000000
#define EQ(a,b) ((a) == (b))
#define LT(a,b) ((a) < (b))
#define LQ(a,b) ((a) <= (b))
#define ElemType int
#define KeyType int
#define TElemType int
#define Status int
#define ERROR 0
#define OK 1
#define FALSE 0
#define TRUE 1
using namespace std;
int cnt = 0;
typedef struct{
ElemType *elem;
int length;
}SSTable;
typedef struct BiTNode{
TElemType data;
struct BiTNode * lchild, * rchild;
}BiTNode, *BiTree ;
int Search_Seq(SSTable ST, KeyType key)
{
ST.elem[0] = key;
int i;
for(i=ST.length;!EQ(ST.elem[i],key);--i);
return i;
}
void init(SSTable &st)
{
st.elem = (int*)malloc(sizeof(int) * (nmax)+1);
st.length = nmax;
srand((int)time(NULL));
for(int i = 1; i<=nmax;++i){
st.elem[i] = rand ()%500;
}
}
int Search_Bin(SSTable st, KeyType key)
{
int low = 1, high = st.length;
while(low<=high){
int mid = (low + high) /2;
if(EQ(key,st.elem[mid])) return mid;
else if(LT(key,st.elem[mid])) high = mid-1;
else low = mid+1;
}
return 0;
}
Status SearchBST(BiTree T,KeyType key, BiTree f, BiTree & p)
{
if(!T) {p = f; return false;}
else if(EQ(key,T->data)) { p = T;return true;}
else if(LT(key,T->data)) return SearchBST(T->lchild,key,T,p);
else return SearchBST(T->rchild,key,T,p);
}
int Search_Bin_None(SSTable st, KeyType key,int low , int high)
{
int mid = (low+high)/2;
if(low>=high) return ERROR;
if(EQ(key,st.elem[mid])) return mid;
else if(LT(key,st.elem[mid])) return Search_Bin_None(st,key,low,mid-1);
else return Search_Bin_None(st,key,mid+1,high);
}
void printtime(double start, double finish,int &cnt )
{
double duration;
duration = (double)((finish - start) / CLOCKS_PER_SEC);
printf("總共耗時%f秒\n",duration);
printf("其中查詢成功%d次\n查詢失敗%d次\n\n",cnt,maxtime - cnt);
cnt = 0;
}
Status InsertBST(BiTree & T, ElemType e)
{
BiTree p;
if(!SearchBST(T,e,NULL,p)){
BiTree s = (BiTree) malloc(sizeof(BiTNode));
s->data = e; s->lchild = s->rchild = NULL;
if(!p) T = s;
else if(LT(e,p->data)) p->lchild = s;
else p->rchild = s;
return true;
}
else return false;
}
void InorderTraverse(BiTree T)
{
if(T){
InorderTraverse(T->lchild);
cnt++;
printf("%d ",T->data);
if(cnt %10 ==0) printf("\n");
InorderTraverse(T->rchild);
}
}
void findelem(SSTable st,BiTree T)
{
init(st);
double start = 0,finish = 0;
printf("順序查詢%d次的情況\n",maxtime);
start = clock();
int cnt = 0;
for(int i = 0; i<maxtime;++i){
if(Search_Seq(st,(i+(rand()%100)/3+1)%750)!=0)
cnt++;
}
finish = clock();
printtime(start,finish,cnt);
printf("二分查詢(非遞迴)%d次的情況\n",maxtime);
sort(st.elem,st.elem+nmax);
start = clock();
for(int i = 0; i<maxtime;++i){
if(Search_Bin(st,(i+(rand()%100)/3+1)%750)){
cnt++;
}
}
finish = clock();
printtime(start,finish,cnt);
printf("二分查詢(遞迴)%d次的情況\n",maxtime);
start = clock();
for(int i = 0; i<maxtime;++i){
if(!Search_Bin_None(st,(i+(rand()%100)/3+1)%750,1,st.length)){
cnt++;
}
}
finish = clock();
printtime(start,finish,cnt);
printf("二叉排序樹查詢%d次的情況\n",maxtime);
for(int i = nmax/2;i>=0;--i){
InsertBST(T,st.elem[nmax/2-i]);
InsertBST(T,st.elem[nmax/2+i]);
}
printf("二叉排序樹中序遍歷結果為\n",maxtime);
InorderTraverse(T);
printf("\n");
for(int i = 0; i<maxtime;++i){
if(InsertBST(T,(i+(rand()%100)/3+1)%750)){
cnt++;
}
}
finish = clock();
printtime(start,finish,cnt);
}
int main()
{
SSTable st;
BiTree T = (BiTree)malloc(sizeof(BiTNode));
T->lchild = T->rchild = NULL;
init(st);
findelem(st,T);
return 0;
}
執行結果
相關推薦
資料結構實驗8-二分查詢與二叉排序樹
實驗要求 用隨機數產生100個待查詢資料元素的關鍵字值。 測試下列各排序函式的機器實際執行時間: (1)順序查詢 (2)二叉排序樹查詢 (3)折半查詢 提示: (1)和(2)使用同樣的實驗資料;(3)要求資料元素必須有序,故需要先使用排序演
資料結構作業19—靜態查詢表與二叉排序樹(選擇題)
2-1將{ 5, 11, 13, 1, 3, 6 }依次插入初始為空的二叉搜尋樹。則該樹的後序遍歷結果是:(3分) A.1, 3, 11, 6, 13, 5 B.1, 3, 5, 6, 13, 11 C.3, 1, 6, 13, 11, 5 D.3, 1
資料結構 折半遞迴查詢,二叉排序樹查詢
實驗題目: 查詢演算法實現與分析 實驗環境: Visual C++ 6.0 實驗專案七:查詢演算法實現與分析 實驗目的:1.掌握順序表的查詢方法,尤其是二分查詢方法。
資料結構:二分查詢與二叉樹
關於二分查詢,原理其實不難,而且java Arrays類裡面有一個sorts()方法,可以先對資料進行排序,然後呼叫binarySerarch()方法,這個方法就是進行二分查詢用的。 下面是JDK的原始碼: private static int binarySe
資料結構實驗6:C++實現二叉樹類
實驗6 學號: 姓名: 專業: 6.1 實驗目的 掌握二叉樹的動態連結串列儲存結構及表示。 掌握二叉樹的三種遍歷演算法(遞迴和非遞迴兩類)。 運用二叉樹三種遍歷的方法求解有關問題。 6
六、二分查詢與二叉查詢樹(小象)
二分查詢演算法(遞迴,迴圈) 具有分治思想的多用迴圈,具有回溯思想的多用遞迴。 二分或者二叉排序樹都是在 分治的解決問題 二分查詢: 二分查詢:待查數是跟中間的數對比,只有查詢的數恰好等於中間的數返回正確; 遞迴 若比中間的數大,則去搜索右區
【資料結構樹表的查詢】二叉排序樹詳解和程式碼(生成、插入、查詢、最大值、最小值、刪除、中序遍歷、銷燬)
二叉排序樹(簡稱BST)又稱二叉查詢(搜尋)樹,其定義為:二叉排序樹或者是空樹,或者是滿足如下性質的二叉樹: (1)若它的左子樹非空,則左子樹上所有記錄的值均小於根記錄的值; (2)若它的右子樹非空,則右子樹上所有記錄的值均大於根記錄的值;
資料結構實驗六是否同一顆二叉樹
資料結構與演算法實驗報告 第六次實驗 姓名:孫瑞霜 一、實驗目的 1、熟練掌握學習的每種結構及其相應演算法; 2、理論聯絡實際,會對現實問題建模並設計相應演算法。 3、優化演算法,使得演算法效率適當提高 二、實驗要求: 1. 認真閱讀和掌握教材上和本實驗相關的內
浙大版《資料結構》習題4.3 是否二叉搜尋樹 (25 分)
本題要求實現函式,判斷給定二叉樹是否二叉搜尋樹。 函式介面定義: bool IsBST ( BinTree T ); 其中BinTree結構定義如下: typedef struct TNode *Position; typedef Position BinT
資料結構學習——帶父節點的二叉搜尋樹全部功能c++實現
第二篇二叉樹我們帶來純c++版本的二叉搜尋樹,這篇程式碼是我學習了很多優秀程式碼之後寫出來的,大家在學習二叉搜尋樹的同時可以著重看下在這裡如何定義的二叉搜尋樹,以及Private和Public的封裝聯動,對程式碼思路是一個很好的提升。 注:在這裡的遍歷我只寫了前序遍歷,其他
資料結構----Recover Binary Search Tree 復原二叉搜尋樹
題目描述: Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing its structure. Note: A sol
java實現順序查詢、二分查詢、雜湊表查詢、二叉排序樹查詢
順序查詢、二分查詢、雜湊表查詢、二叉排序樹查詢這幾種查詢演算法是面試中常被問到的幾種演算法。 1. 順序查詢 對於陣列,按順序比較給定的值,時間複雜度0(n),,以下是實現: public static int Linear_Search(int[] data, i
查詢演算法,簡單查詢,二叉排序樹,索引查詢,雜湊表
利用了元素間的次序關係,採用分治策略,可在最壞的情況下用O(log n)完成搜尋任務。它的基本思想是,將n個元素分成個數大致相同的兩半,取a[n/2]與欲查詢的x作比較,如果x=a[n/2]則找到x,演算法終止。如 果x<a[n/2],則我們只要在陣列a的左半部繼續搜尋x(這裡假設陣列元素呈升序排列)
索引順序表查詢和二叉排序樹查詢
二叉排序樹(BST)的定義為:二叉排序樹或者是空樹,或者是滿足下列性質的二叉樹: (1) :若左子樹不為空,則左子樹上所有結點的值(關鍵字)都小於根結點的值; (2) :若右子樹不為空,則右子樹上所有結點的值(關鍵字)都大於根結點的值; (3) :左、右子樹都分別是二叉
查詢之二叉排序樹(Binary Sort Tree)及其C實現
大話資料結構學習筆記 - 查詢之二叉排序樹(Binary Sort Tree)及其C實現 二叉排序樹 二叉排序樹(Binary Sort Tree):又稱為 二叉查詢樹, 它或者是一個空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上
nyoj 1278G: Prototypes analyze 與 二叉排序樹(BST)模板
node names 插入 ins def print analyze () 搜索樹 參考博客:https://blog.csdn.net/stpeace/article/details/9067029 參考博客:https://blog.csdn.net/baidu_35
資料結構實驗之查詢一:二叉排序樹 (SDUT 3373)
二叉排序樹(Binary Sort Tree),又稱二叉查詢樹(Binary Search Tree),也稱二叉搜尋樹。 #include <stdio.h> #include <string.h> #include <stdlib.h> struct nod
SDUT3374資料結構實驗之查詢一:二叉排序樹
判斷是否為同一棵二叉排序樹 解決這個問題需要兩步: 1.建立二叉排序樹 2.判斷兩棵樹是否相同 詳情看程式碼和註釋,懶人程式碼 #include <iostream> #include <cstring> using namespace std; type
二叉排序樹的應用之——資料結構實驗之查詢三:樹的種類統計
注意:中序遍歷二叉樹時,只能在樹不為空的時候才能進行遞迴呼叫! 資料結構實驗之查詢三:樹的種類統計 Time Limit: 400 ms Memory Limit: 65536 KiB Submit Statistic Problem Descr
資料結構:由有序數列建立一棵高度最小的二叉排序樹與判斷一 個序列是否為該二叉排序樹中的一個合法查詢序列
編寫一個程式,對於給定的一個有序的關鍵字序列,建立一棵高度最小的二叉排序樹。並判斷一個序列是否為該二叉排序樹中的一個合法的查詢序列 #include<stdio.h> #include<stdlib.h> typedef struct node