R15-數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)

1. 哈希宴偿,hash昭齐,所有滿足 key: value 的都是哈希尿招,很抽象,

比如數(shù)組阱驾、對象就谜,都是哈希
a = [7,3,2,,8,4,7,73,1]
比較排序如冒泡、選擇排序里覆,
至少會遍歷一次比較一次丧荐,
比較排序的時間復(fù)雜度的極限,最快最快也要 nlogn

a = {
  "0": 0,
  "1": 6,
  "2": 2,
  "6": 8,
  "9": 3,
  "22": 76,
  "66": 23,
  "length": 66   //數(shù)組的length是由 最大的數(shù)字下標+1,
                 //中間沒寫的實際上默認為空喧枷?
}

2. 計數(shù)排序

a = [7,1,2,6,6,3,5,9,0]  //數(shù)組

var index;  //下標
var hash=[]  //定義hash

for(var i=0; i<a.length; i++){
  index = a[i];  //取出值
  if(hash[index] != undefined){
    hash[index] += 1;  //此值出現(xiàn)次數(shù)增加
  }
  else{
    hash[index] = 1; //此值第一次出現(xiàn)
  }
}

var arr = []; //定義數(shù)組
var count;    //用于計數(shù)
// 遍歷hash篮奄,將值從小到大存到新數(shù)組中
for(var i=0; i<=hash.length; i++){
  count = hash[i];         // 得到i值的數(shù)量
  if(count != undefined){   // count存在
    for(var j=0; j<count; j++){  //假設(shè)存在多個i值
      arr.push(i);   // push i值
    }
  }
}

復(fù)雜度:O(n+max),比快排還快
缺點:
必須要有一個hash作為計數(shù)的工具
無法對小數(shù)和負數(shù)排序(從0開始)

3. 桶排序割去,與計數(shù)排序類似

但是 計數(shù)排序是一個桶內(nèi)放一個數(shù)字

hash:{
  "1": 1,
  "2": 1,
  "3": 1,
  "4": 1,
  "7": 1,
  "76": 1
}
而 桶排序是一個桶內(nèi)放一定范圍內(nèi)的數(shù)字
hash:{
  "1": [0,6,2,8,3],  // 10以內(nèi)的數(shù)字
  "2": [],         // 20以內(nèi)
  "3": [],
  "4": [],
  "5": [],
  "6": [],
  "7": [],
  "8": [76]  // 80以內(nèi)
}

桶排序還需要做二次排序
好處是縮短了空間,只用了8個桶昼丑,而計數(shù)排序用了76個桶呻逆,浪費了空間
壞處是浪費了時間,計數(shù)排序則節(jié)約了時間
排序就是菩帝,要么浪費空間咖城,要么浪費時間,
什么時候用桶排序:比如高考分數(shù)排序呼奢,100分以下一個桶……700分以下一個桶宜雀,這樣只用七個桶,而計數(shù)排序則需要700個桶握础,每分都要一個桶
桶排序是計數(shù)排序的升級

4. 基數(shù)排序

可以適應(yīng)特別特別大的數(shù)字
具體見 https://visualgo.net/bn/sorting

計數(shù)排序:很浪費桶辐董,排的次數(shù),入一次禀综,出一次
桶排序 :桶的個數(shù)由你定简烘,想要幾個桶就幾個桶苔严,也是入一次出一次,但是還要再排序孤澎,因為是亂的届氢,之后如何排序看情況
基數(shù)排序:桶的個數(shù)是固定的,只有10個(0~9)覆旭,排的次數(shù)由數(shù)值的位數(shù)定退子,四位數(shù)要排4次

5. 隊列 queue(一個抽象的概念)

先進先出(沒了,這就是隊列)
在現(xiàn)實生活中的例子:排隊
可以用數(shù)組實現(xiàn)型将,比如

var q=[];
q.push("alice")  //入隊 q["alice"]
q.push("ben")    // q["alice","ben"]
q.push("jack")   // q["alice","ben","jack"]
// 出隊
q.shift()     //alice出來  q["ben","jack"]
q.shift()     //ben出來    q["jack"]
q.shift()     //jack出來   q[]

有什么用?
如果你要做一個12306的排隊系統(tǒng)寂祥,那么就用隊列,先買票的人先出票

6. 棧 stack

先進后出
也可以用數(shù)組實現(xiàn)

var stack = []
stack.push("第1層")   // stack["第1層"]
stack.push("第2層")   // stack["第1層","第2層"]
stack.push("第3層")   // stack["第1層","第2層","第3層"]
stack.pop()   // 第3層 stack["第1層","第2層"]
stack.pop()   // 第2層 stack["第1層"]
stack.pop()   // 第3層 stack[]

7. 鏈表 linked list

數(shù)組無法直接刪除中間的一項茶敏,連表可以
用哈希(js里面用對象表示哈希)實現(xiàn)鏈表

// 這里簡寫壤靶,只用了一個變量,其它變量嵌套在內(nèi)
var a = {
  value: 1,
  next: {
    value: 2,
    next: {
      value: 3,
      next: undefined
    }
  }
}
a.value  //1
a.next.value  // 2
a.next.next.value  //3
//  將a.next的引用改為指向a.next.next
//  從而達到刪除原本的a.next,也就是 2 的效果
a.next =  a.next.next
a.next  // 3
a.next.next  // undefiend

鏈表查詢很慢惊搏,比如上面的a.next.next,如果有很多就需要.next不停
而數(shù)組就快很多贮乳,比如查找第n個,只需要a[n-1]就可以了
數(shù)組查詢很快恬惯,鏈表刪除很快
鏈表有2個概念
head和node
比如上面的例子向拆,還原為

var a3={
  value: 3,
  next: undefined
}
var a2={
  value: 2,
  next: a3
}
var a = {
  value: 1,
  next: a2
}

a就是這個鏈表的表頭,也就是head酪耳,
只要找到表頭浓恳,就可以找到后面的所有項
其它的都是節(jié)點,表頭也是節(jié)點碗暗,node

8. 樹 tree (鏈表的升級颈将,全程只有一個箭頭就是鏈表,如果中途分叉了就是樹)

只要你有層級言疗,你就要用到樹晴圾,
比如我們寫的網(wǎng)頁頁面就用到樹
dom也是樹
概念:
-層數(shù),比如html是第一層噪奄,head與body是第二層
-深度死姚,一共有多少層
-節(jié)點個數(shù),每一個hash就是一個節(jié)點勤篮,如上面都毒,html是一個,head是一個碰缔,body是一個
沒有兒子的節(jié)點叫做葉子節(jié)點账劲,葉子上布會再長葉子

二叉樹
就是每次最多分兩個叉,可以分一個叉

                     html{
                       tag:html,
                       children:[head,body]
                     }
head{                                    body{
  tag: head,                              tag: body,
  children: [meta1, meta2]                children: [h1,h2]
}                                        }
meta1{         meta2{                  h1{            
  tag:meta1     tag:meta2               tag:h1         
}              }                       }              
滿二叉樹
就是葉子是長滿的,除去葉子節(jié)點涤垫,每個節(jié)點都有兩個兒子姑尺,就是滿二叉樹
                     html{
                       tag:html,
                       children:[head,body]
                     }
head{                                    body{
  tag: head,                              tag: body,
  children: [meta1, meta2]                children: [h1,h2]
}                                        }
meta1{         meta2{                  h1{             h2{
  tag:meta1     tag:meta2               tag:h1         tag:h2
}              }                       }               }
二叉樹
層數(shù)i     那一層最多有幾個節(jié)點    所有層          下標
0           1       2^0            1(2^1-1)        0
1           2       2^1            3(2^2-1)        1~2
2           4       2^2            7(2^3-1)        3~6
3           8       2^3            15(2^4-1)       7~14
4           16      2^4            31(2^5-1)       15~30
5           32      2^4            63(2^6-1)       31~62

二叉樹的第i層至多擁有2^(i-1)個節(jié)點數(shù),
深度為k的二叉樹至多總共有2^(k+1)-1 個節(jié)點數(shù)(定義根節(jié)點所在深度 k0 = 0);

而總計擁有節(jié)點數(shù)符合的蝠猬,稱為“滿二叉樹”切蟋,
深度為k有n個節(jié)點的二叉樹,當(dāng)且僅當(dāng)其中的每一節(jié)點榆芦,都可以和同樣深度k的滿二叉樹柄粹,序號為1到n的節(jié)點一對一對應(yīng)時,稱為“完全二叉樹”;
類型
二叉樹是一個有根樹匆绣,并且每個節(jié)點最多有2個子節(jié)點;
一棵深度為k驻右,且有2^(k+1)-1個節(jié)點的二叉樹,稱為滿二叉樹(Full Binary Tree)崎淳;

在一顆二叉樹中堪夭,除最后一層外,若其余層都是滿的拣凹,并且最后一層或者是滿的森爽,或者是在右邊缺少連續(xù)若干節(jié)點,則此二叉樹為完全二叉樹(Complete Binary Tree))
深度為k的完全二叉樹嚣镜,至少有2k個節(jié)點爬迟,至多有2(K+1)-1個節(jié)點;
比如深度為4的完全二叉樹,最少有8個節(jié)點菊匿,最多有15個節(jié)點

完全二叉樹和滿二叉樹可以用數(shù)組來實現(xiàn)

a = [0,  1,2,  3,4,5,6,   7,8,9,10,11,12,13,14]
//  1層  2層   3層        4層
                    0
               1          2
            3     4    5     6
           7 8 9  10 11 12 13 14
如果要找第三層的第一個數(shù)字
a[2^2-1]  // 3
a[2^3-1]  // 7 第四層第一個數(shù)字
a[2^2-1+3]// 6 第三層第四個數(shù)字
通過下標的公式就能取到第n層的第m個數(shù)字付呕,
因為這是完全二叉樹,從左到右依次存的

其它樹可以用哈希(對象)實現(xiàn)

堆排序
http://bubkoo.com/2014/01/14/sort-algorithm/heap-sort/
最大堆
最大堆調(diào)整

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末跌捆,一起剝皮案震驚了整個濱河市徽职,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌佩厚,老刑警劉巖活箕,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異可款,居然都是意外死亡,警方通過查閱死者的電腦和手機克蚂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門闺鲸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人埃叭,你說我怎么就攤上這事摸恍。” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵立镶,是天一觀的道長壁袄。 經(jīng)常有香客問我,道長媚媒,這世上最難降的妖魔是什么嗜逻? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮缭召,結(jié)果婚禮上栈顷,老公的妹妹穿的比我還像新娘。我一直安慰自己嵌巷,他們只是感情好萄凤,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搪哪,像睡著了一般靡努。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晓折,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天惑朦,我揣著相機與錄音,去河邊找鬼已维。 笑死行嗤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垛耳。 我是一名探鬼主播栅屏,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼堂鲜!你這毒婦竟也來了栈雳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤缔莲,失蹤者是張志新(化名)和其女友劉穎哥纫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痴奏,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蛀骇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了读拆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片擅憔。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖檐晕,靈堂內(nèi)的尸體忽然破棺而出暑诸,到底是詐尸還是另有隱情蚌讼,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布个榕,位于F島的核電站篡石,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏西采。R本人自食惡果不足惜凰萨,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苛让。 院中可真熱鬧沟蔑,春花似錦、人聲如沸狱杰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仿畸。三九已至食棕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間错沽,已是汗流浹背簿晓。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留千埃,地道東北人憔儿。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像放可,于是被迫代替她去往敵國和親谒臼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容