Acwing Arithmetic Learning:資料結構(2)

~快樂王子~ 發表於 2021-06-26
資料結構

資料結構(2)acwing

image-20210626200453694

1.trie樹

  • 快速儲存和查詢字串的集合
  • 結構特徵:image-20210626175138514
  • 例題:Trie字串統計 ?

2.並查集(近乎O(1))

  • 思路
  1. 將兩個集合合併
  2. 詢問兩個元素是否在一個集合中
  • 基本原理:

    每個集合用一顆樹來表示,樹根的編號就是整個集合的編號。每個節點儲存他的父節點,p[x]表示x的父節點

  • 問題:

  1. 問題1:如何判斷樹根:if(p[x] == x)
  2. 問題2:如何求x的集合編號:while(p[x] != x) x = p[x];
  3. 問題3:如何合併兩個集合:px是x的集合編號,py是y的集合編號。p[x] = y,直接上圖image-20210626191315099

優化:

1.路徑壓縮

  1. scanf使用%s會預設忽略“空格”和"回車",不用%c
  • 上程式碼:image-20210626191425784

3.堆

  • 概念:”小根堆“(顧名思義{根小於左右兒子})----》為“完全二叉樹”(最後一行可以不滿,以上全滿),上圖

image-20210626195342299

  • 儲存方式(一維陣列儲存)

    image-20210626195623804

    • x的左兒子:2x
    • x的右兒子:2x+1
  • 如何手寫一個堆?

    1. 插入一個數

      heap[ ++ size] = x;up(size);
      
    2. 求集合中最小值

      heap[1];
      
    3. 刪除最小值

      heap[1] = heap[size];size --;down(1);
      
    4. 刪除任意一個元素

      heap[k] = heap[size];size --; down(k);up(k);
      
    5. 修改任意一個元素

      heap[k] = x;down(k);up(k);
      

相關文章