二分查找和二叉查找樹

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

1? 二分查找

算法思想:

二分查找要求元素排列有序。首先,假設表中元素是按升序排列,將數組中間位置的元素與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將數組分成前、后兩個子數組,如果中間位置記錄的元素大于查找關鍵字,則進一步查找前一子數組,否則進一步查找后一子數組。重復以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。

二分查找的時間復雜度為O(logN)

算法實現:

遞歸算法:

//遞歸算法
public int rank(Key key, int lo, int hi) {if(hi<lo)	return lo;int mid = lo + (hi-lo)/2;int cmp = key.compareTo(keys[mid]);if(cmp<0)	return rank(key,lo,hi-1);if(cmp>0)	return rank(key,mid+1,hi);else return mid;
}

非遞歸算法:

//非遞歸算法
public int rank(Key key) {int lo = 0, hi = N-1;while(lo<=hi) {int mid = lo + (hi-lo)/2;int cmp = key.compareTo(keys[mid]);if(cmp<0)	hi = mid-1;if(cmp>0)	lo = mid+1;else return mid;}return lo;
}

2? 二叉查找樹

定義:

二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:

  • 若左子樹不空,則左子樹上所有結點的值均小于或等于它的根結點的值;
  • 若右子樹不空,則右子樹上所有結點的值均大于或等于它的根結點的值;
  • 左、右子樹也分別為二叉排序樹;

步驟:

若根結點的關鍵字值等于查找的關鍵字,成功。否則,若小于根結點的關鍵字值,遞歸查左子樹。若大于根結點的關鍵字值,遞歸查右子樹。若子樹為空,查找不成功。

二叉查找樹的時間復雜度為O(logN)

算法實現:

結點類:

private class Node{private Key key;private Value val;private Node left,right;private int N;public Node(Key key,Value val, int N) {	this.key = key; this.val = val; this.N = N; }
}

其中N為以該節點為根的子樹的節點總數,計算方法如下:

size(x) = size(x.left) + size(x.right) + 1

?查找方法:

遞歸查找,如果小于當前結點,遞歸去左子樹查找;如果大于當前結點,遞歸去右子樹查找。

public Value get(Key key) {return get(root,key);
}
public Value get(Node x,Key key) {if(x==null)return null;int cmp = key.compareTo(x.key);if(cmp<0)	return get(x.left,key);if(cmp>0)	return get(x.right,key);else return x.val;
}

插入方法:

先查找,如果樹中已經存在相應的鍵,只需更新值;如果查詢無果,指針也已經指向了應該插入的位置,用要插入的鍵值對新創結點并插入到相關位置。

public void put(Key key,Value val) {root = put(root,key,val);
}
private Node put(Node x,Key key,Value val) {if(x == null) return new Node(key,val,1);int cmp = key.compareTo(x.key);if(cmp<0)	x.left = put(x.left,key,val);//插入左子樹if(cmp>0)	x.right = put(x.right,key,val);//插入右子樹else x.val = val;//更新值x.N = size(x.left) + size(x.right)+1;return x;
}

刪除方法:

  1. 即將被刪除的節點記為t
  2. x指向它的后繼節點min(t.right)
  3. 將x的右鏈接鏈接到x的父節點的左鏈接上(即替換掉原x的位置)
  4. 用x節點替換t節點(將t.left和t.right設為x.left和x.right)
public void delete(Key key) {root = delete(root,key);
}
private Node delete(Node x,Key key) {if(x == null)	return null;int cmp = key.compareTo(x.key);if(cmp<0)	x.left = delete(x.left,key);if(cmp>0)	x.right = delete(x.right,key);else {if(x.right == null)		return x.left;if(x.left == null)		return x.right;Node t = x;x = min(t.right);x.right = deleteMin(t.right);x.left = t.left;}x.N = size(x.left)+size(x.right)+1;return x;
}

?

轉載于:https://my.oschina.net/HuoQibin/blog/1590855

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539827.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539827.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539827.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springboot判斷有沒有庫_Springboot 使用JPA @Query 注解 查詢語句條件 有可能為空,Oracle數據庫...

網上查了很多資料都是下面的方法,但是不適用于OracleQuery(value "select * from xxx where if(?1 !,x1?1,11) and if(?2 !,x2?2,11)" "and if(?3 !,x3?3,11) ",nativeQuery true)List find(String X1,String X2,String X3);——————————…

臺式計算機技術方案,2017年4月自考02316計算機應用技術真題及答案

本文提供的是2017年4月自考02316計算機應用技術真題及答案&#xff0c;真題不僅能幫助考生復習鞏固學到的知識&#xff0c;還能讓考生了解以往考試難易程度&#xff0c;真正掌握一套真題那么考試也不用擔心了。要考試的你一定要多多練習啊。2017 年 4 月高等教育自學考試全國統…

Linux磁盤編號

一、IDE接口磁盤 Linux的編碼規則是 /dev/hd* -------------------------------hda 第一塊盤 -------------------------------------------hda1 第一分區&#xff0c;hda2 第二分區&#xff0c;hda3 第三分區..... -------------------------------hdb 第二塊盤 …

Linux掛載點和文件系統類型介紹

一、掛載點 Mount Point 這是Linux下訪問磁盤分區的入口&#xff0c;即如果要往分區里寫入數據&#xff0c;就必須通過/boot入口來寫入&#xff0c;這一點和windows是不同的&#xff0c;因為在安裝Linux時&#xff0c;Mount Point項填寫 /boot二、文件系統類型 1、ext2/3/4&…

pythonint函數的參數_向嵌入的Python函數傳遞兩個參數(int和array)

我需要從我的模塊中調用Python函數并為其設置兩個參數&#xff1a;int和array。在現在我在調用這個函數的時候遇到了segfault&#xff0c;我不知道我做錯了什么。有人能指出我的錯誤在哪里嗎&#xff1f;在函數在我的Python模塊中應用程序副本. 如果我從Python代碼調用它&#…

理解lua中 . : self

文章目錄[點擊展開](?)[] 前言點號定義和調用冒號定義和冒號調用運行結果相互調用相互調用運行結果總結前言 在LUA中&#xff0c;經常可以看到&#xff1a;. self&#xff0c;今天在CSDN上看到一篇博客寫的很清楚&#xff0c;轉載過來 原文出處&#xff1a;http://blog.csdn.n…

適合初中文憑學的計算機技術,初中畢業學啥技術好 最吃香的手藝

很多初中畢業的初中生因為成績不是很理想&#xff0c;不能上一所理想的高中&#xff0c;所以選擇學一門技術&#xff0c;那么初中畢業學啥技術好呢&#xff0c;哪些手藝未來比較吃香呢&#xff0c;下面小編為大家分析一下初中畢業應該學什么手藝。初中畢業學哪些技術發展好汽修…

SecureCRT配置

一、下載 路徑&#xff1a;http://www.pc6.com/softview/softview_24396.html 里面有破解教程 二、配置 1、選擇仿真環境養眼的綠色字體黑色背景配置&#xff0c;選擇 traditional option->Global options –>default session -> edit default settings -> 修改…

左室短軸切面_一文讀懂心臟超聲基本切面

一. 本文出現的英文簡稱二.超聲心動圖基本切面采用與心臟相互垂直的三個基本平面&#xff0c;主要觀測心臟各房室腔內徑、容積和室壁厚度及其相關解剖結構運動狀態、功能等。檢查中探頭最常放置的位置包括心底部、心尖部、劍突下&#xff0c;鎖骨/胸骨上窩等。心臟超聲檢查中探…

怎么用計算機彈c哩c哩,計算器音樂c哩c哩樂譜 | 手游網游頁游攻略大全

發布時間&#xff1a;2016-06-29鏟子騎士樂譜有什么用 鏟子騎士樂譜賣不了怎么辦.不少鏟子騎士玩家收集了一些樂譜,那么這些樂譜功能是什么呢?下面99單機網小編給大家介紹鏟子騎士樂譜有什么用 鏟子騎士樂譜賣不了怎么辦. 樂譜可以賣錢,還可以更換游戲中的音樂 ...標簽&#x…

Windows 7 資源管理器搜索Channel 9 視頻

在Windows 7 中Federated Search 可以通過OpenSearch 協議訪問到遠程數據資源&#xff0c;也就意味著用戶可以使用資源管理器&#xff08;Windows Explorer&#xff09;搜索并瀏覽遠程數據。本篇我們將制作一個搜索連接器&#xff08;Search Connector&#xff09;查找Channel …

python django flask介紹_django和flask哪個值得研究學習

對于初學者來說&#xff0c;找到一個好的框架來學習或者項目開發都是非常有必要的&#xff0c;而當你有一定開發經驗后&#xff0c;你應該選擇適合當前業務需要的框架。我這里并不想探討哪個框架好哪個不好&#xff0c;這個永恒的話題就跟探討“世界上哪種編程語言最屌”是一樣…

sts html視圖編輯器,免費的HTML可視化編輯器HBuilder前端開發編輯器 | 老瘋子

互聯網上幾款比較熱門的編輯器Dreamweaver、Notepad、Sublime Text、Vim、Emacs等&#xff0c;這些或許你用過其中之一或許聽說過它們。這些都是國外人員開發的有些甚至被公認為是最受專業程序員喜愛的代碼編輯器(Vim和Emacs)。都是國外的&#xff0c;那國內的呢&#xff1f;當…

css層疊樣式初學

一、css簡介 1、層疊樣式表&#xff1a;疊加效果&#xff0c;不同css對同一html修飾&#xff0c;沖突部分&#xff0c;優先級高作用&#xff0c;不沖突部分&#xff0c;共同作用 2、css作用 (1)修飾html     (2)替代了標簽自身的顏色&#xff0c;字號等屬性&#xff0c;提高…

sum(x) over( partition by y ORDER BY z ) 分析

參考的博文出處&#xff1a;http://www.cnblogs.com/luhe/p/4155612.html&#xff0c;對博文進行了修改新增&#xff0c;修改了錯誤的地方 之前用過row_number()&#xff0c;rank()等排序與over( partition by ... ORDER BY ...)&#xff0c;這兩個比較好理解: 先分組&#xff…

sqlserver 日期與字符串之間的轉換

字符轉換為日期時,Style的使用 --1. Style101時,表示日期字符串為:mm/dd/yyyy格式SELECT CONVERT(datetime,11/1/2003,101)--結果:2003-11-01 00:00:00.000 --2. Style101時,表示日期字符串為:dd/mm/yyyy格式SELECT CONVERT(datetime,11/1/2003,103)--結果:2003-01-11 00:00:00…

idea數據庫反向生成實體類_IntelliJ IDEA 的數據庫管理工具實在太方便了

1. 前言對于一個有軟件潔癖的人&#xff0c;能用現有的軟件解決問題的絕不安裝新的軟件。Java后端開發主要跟數據庫打交道&#xff0c;所以數據庫圖形化界面&#xff08;GUI&#xff09;是少不了的。通常圖形化操作關系型數據庫&#xff08;RMDBS&#xff09;大多數人會選擇Nav…

DBMS_OUTPUT.PUT_LINE沒有輸出

解決方法&#xff1a; 打開打印輸出 set serveroutput on;問&#xff1a; 明明設了&#xff0c;但是還是沒有打印啊&#xff01; 答&#xff1a; 只有在調用 存儲過程的時候&#xff0c;才會打印出來。在創建編譯的時候&#xff0c;是不會打印出來的。 &#xff08;博主今天…

Fresco 二三事:圖片處理之旋轉、縮放、裁剪切割圖片

關于Fresco加載圖片的處理&#xff0c;例如旋轉、裁剪切割圖片&#xff0c;在官方文檔也都有提到&#xff0c;只是感覺寫的不太詳細&#xff0c;正好最近項目里有類似需求&#xff0c;所以分享一些使用小tip&#xff0c;后面的朋友就不用再走彎路浪費時間了。&#xff08;測試圖…

老年人計算機應用基礎,國開電大老年心理健康作業一參考答案

題目1.腦功能衰退明顯的癥狀是( )。A. 記憶力衰退B. 皮膚老化C. 孤獨感強D. 感知覺能力的退化【答案】&#xff1a;記憶力衰退題目2.下列哪項不屬于老年人的特點&#xff1a;( )。A. 肺功能下降B. 體重下降C. 視野狹窄D. 嗜睡【答案】&#xff1a;嗜睡題目3.下列不是診斷老年…