資料結構演算法爬坑日記十三

2021-10-23 21:09:52 字數 1989 閱讀 3100

堆是乙個完全二叉樹,每個節點的值都大於或等於左右節點的值的堆叫大頂堆,小於左右節點的值的堆叫小頂堆

思路:先將原數列構造成乙個大頂堆或小頂堆(是數列下標對應的順序儲存二叉樹)

,然後將根節點與數列最後的節

點進行交換,再將剩餘的數列構成乙個堆,迴圈直到得到乙個有序序列,一般公升序用大頂堆,降序用小頂堆

構建大頂堆思路:從最後乙個非葉子節點對應子樹開始與其左右節點進行比較交換,依次向上比較,直到全部交換完

畢即可得到乙個大頂堆

**實現(公升序)

//堆排序

public

class

heapselect

int temp;

//中間交換數

//將原陣列構建成乙個大頂堆

for(

int i = arr.length /2-

1; i >=

0; i--

)//將大頂堆的頂與陣列最後的數進行交換

for(

int i = arr.length -

1; i >

0; i--

) system.out.

println

(arrays.

tostring

(arr));

}// length 需要排序的陣列的長度 i為需要構成大頂堆的陣列下標

public

static

void

select

(int

arr,

int length,

int i)

//如果子節點大於根節點,交換兩數

if(temp < arr[j]

)else

arr[i]

= temp;}}

}八千萬條資料測試平均時間1s左右

給定n個權值作為n個葉子節,構成一顆二叉樹,若該樹的帶權路徑長度最小,稱這樣的樹為最優二叉樹(哈夫曼樹)

帶權路徑長度:節點的權值與路徑長度的乘積

樹的帶權路徑:所有葉子節點的帶權路徑長度的和

哈夫曼樹構建思路:將需要構建哈夫曼樹的對應數列公升序排列,取出前兩個樹,將其作為左右節點,她們的權值的和

構成父節點,形成一顆二叉樹,將新二叉樹的父節點加入數列,同時刪除原來的兩個數,繼續迴圈此操作,直到所有的

數全部排完即可獲得一顆哈夫曼樹

**實現

**節點類

//哈夫曼樹節點

public

class

huffmantreenode

implements

comparable

@override

public

intcompareto

(huffmantreenode o)

public

void

pre()if

(this

.right != null)}}

**哈夫曼樹類

//哈夫曼樹

public

class

huffmantree

;createhuffmantree

(arr)

.pre()

;}//建立哈夫曼樹

public

static huffmantreenode createhuffmantree

(int

arr)

while

(list.

size()

>1)

return list.

get(0)

;}}哈夫曼編碼:將需要編碼的檔案以每個位元組出現的次數作為權值,位元組的值作為節點儲存的資料值,構成一顆哈夫曼

樹,同時規定向左和向右分別為0和1

,得到每個葉子節點對應得路徑對應的01字串,以此字串**此位元組的編碼

方式,以此編碼方式來壓縮檔案,進行傳輸,對方再以該編碼方式進行解碼即可

資料結構演算法爬坑日記一

線性結構 最常用的資料結構,特點是資料元素之間存在一對一的線性關係 分倆種儲存結構 1.順序儲存結構 又稱為順序表,儲存元素是連續的 2.鏈式儲存結構 又稱為鍊錶,儲存元素不一定是連續的,元素節點中存放資料元素以及相鄰元素的位址結構 常見線性資料結構 陣列 佇列 鍊錶 棧 非線性結構 常見二維陣列 ...

資料結構演算法爬坑日記六

回溯法 也叫向前試探法,試著尋找正確的求解,當探索到某一步不符合規則時,便回退到上一步進行重新選擇,直到獲取預期的解法 問題描述 在8 8的西洋棋棋盤上,放置八個皇后且八個皇后不能互相攻擊 思路 先將第乙個放在第一行第一列,然後將第二個放在第二行第一列,檢查是否滿足規則,如果滿足則進入第三個的放 置...

資料結構演算法爬坑日記八

思想 通過一次排序將一組資料分為兩部分,一部分全部比另一部分小,然後對兩部分分別再進行快排,迴圈此操作,直到不能再分割,便得到乙個有序序列 實現 快速排序 public class quicksort sort arr,0,arr.length 1 system.out.println arrays...