1. 程式人生 > >陣列、連結串列和二叉樹的應用場景

陣列、連結串列和二叉樹的應用場景

很明顯,題主沒有學的比較好。
或者沒參加過acm的相關訓練。只是一個平時跟著學做些課後題然後混畢業的。

二叉樹,本質上,是對連結串列和陣列的一個折中。。
比如,我有一個任務,需要輸入
10萬個資料(32位整數),然後有兩個操作:
1.新增(刪除)一個整數。
2.詢問第x大的資料。

比如,我給你 1, 8, 13, 10(等等一堆資料).......
然後我詢問第3大的資料,
然後我插入 18
然後我詢問第4大的資料
我再插入 9
我再詢問第2大的資料

不停的重複1,2
重複10萬次。。

應該如何實現。
你會發現,用有序連結串列,不行,查詢(包括1需要找到對應位置,以及2查詢)成本大O(N),但具體這個插入操作成本小O(1)。
用有序陣列,查詢(2的查詢)成本小O(1)。但1的插入操作成本很大O(N)。

所以,我們折中使用排序二叉樹(二叉樹僅僅作為排序二叉樹的基礎),查詢(包括1需要找到對應位置,以及2查詢)成本挺小O(logN)。具體這個插入操作成本也挺小O(logN)。

具體的應用就是由排序二叉樹(由於普通排序二叉樹可能會有不平衡的情況)引申出來的紅黑樹(linux中ext3檔案系統管理),avl樹“windows對程序地址空間的管理”。

回答不出來也不怪你。畢竟這些知識絕對是超綱了。
這是一個口子小但可以扯的很多的題目,你能大概講個二叉樹的遍歷也就算可以了。只是和某些acm的選手來說,你會很吃虧。因為acm選手是知道並且用過紅黑樹之類的東西的。



應該用什麼姿勢學演算法?
演算法在具體工作中用的真的不多,就剩半年,你也不可能學到acm選手的程度。。所以建議,去實習吧,關於演算法,把你們以前的那本演算法教材給撿起來複習複習,每一個具體的演算法例子都給用程式碼敲一遍,跑一跑,大學也就基本結束了。。。。。不要太多留戀了,半年很快的。 實習工作找不到?總能找到的,只是可能待遇不好。轉正的工資不怎麼樣而已。


演算法學的好又能怎麼樣。
比如我,吃著火鍋,裝著b,結果還不是混的很慘。匿名了。

最後謝邀。



============================4月2日修改==============================
感謝諸位大神捧場。
點贊挺多了,我就對“二叉樹,本質上,是對連結串列和陣列的一個折中” 補充幾個腦洞:
建立在如下推論上:假定把陣列看成N叉樹,那麼連結串列就是1叉樹,由於陣列只有1層,二叉樹有logN層,而連結串列有N層,"logN對1" 以及 "N對logN" 都是 無限大的關係。。。相當於我們在1 ~ N之間找了一個logN作為兩者的折中。。。。。。
進一步的腦洞是,如果我們是a叉樹,那麼結果就是log(a)N = \frac{log(2)N}{log(2)a}
層,但
考慮分母部分。
  • a = 1時,log(2)1 = 0
  • a = 2時,log(2)2 = 1
  • a = N時,log(2)N = N

恰好構成了 0, 1, N的三個經典數字。。。。
查詢和插入一共所需的次數可以簡化為:每層數量+總層數 = a + \frac{log(2)N}{log(2)a} 當a是大於等於1的整數時,a取2是最划算的。。。所以綜合以上推斷,個人得出,"二叉樹,本質上,是對連結串列和陣列的一個折中"。 這對於查詢和插入是類似1:1(同一數量級)的需求,用二叉樹(排序二叉樹等)是很划算的。如果不是同一數量級可以考慮,增大a或者減少a,具體問題具體分析,這是個工程問題。得考慮編碼難度,演算法常數,可維護性等多方面需求。不再一一分析。

以上僅僅是個人奉獻的腦洞,沒有任何成熟的理論支撐。感謝看到這裡。

相關推薦

陣列連結串列應用場景

很明顯,題主沒有學的比較好。 或者沒參加過acm的相關訓練。只是一個平時跟著學做些課後題然後混畢業的。 二叉樹,本質上,是對連結串列和陣列的一個折中。。 比如,我有一個任務,需要輸入 10萬個資料(32位整數),然後有兩個操作: 1.新增(刪除)一個整數。 2.詢問第x大的資料。 比如,我給你 1, 8,

常見的資料結構(棧佇列陣列連結串列紅黑

(一)棧 棧:stack,又稱堆疊,它是運算受限的線性表,其限制是僅允許在標的一端進行插入和刪除操作,不允許在其 他任何位置進行新增、查詢、刪除等操作。 簡單的說:採用該結構的集合,對元素的存取有如下的特點先進後出(即,存進去的元素,要在後它後面的元素依次取出後,才能取出該元素)。例如,子彈

陣列連結串列的演進

我們最常用的資料結構就是樹,最基礎的資料結構是陣列,那麼樹在陣列的基礎上解決了什麼問題?為什麼用樹而不用陣列?下面我們來詳細的剖析一下: 上面的圖是陣列、連結串列和樹的示意圖,可以看到,陣列中的元素沒有指標,單向連結串列有一個指標,雙向連結串列有兩個指標,它們都是表示的順序關係,也就是

【Java面試12】常用演算法(冒泡插入選擇快速)詳解

常用演算法(冒泡、插入、選擇、快速)和二叉樹詳解     同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程式的效率。演算法分析的目的在於選擇合適演算法和改進演算法。   電腦科學中,演算法的時間複雜度是一個函式,它定量描述了該演算法的執行時間。這是一個關於

資料結構C語言——用連結串列

標頭檔案,定義棧和結構體的功能: /* 二叉樹的連結表示*/ #include <stdio.h> #include <stdlib.h> typedef char DataType; struct BinTreeNode; typedef

資料結構(棧,佇列,連結串列

棧 棧作為一種資料結構,用途十分廣泛。在回撥函式等許多場景中都有應用。我們需要了解它的基本用途,那就是先進後出和佇列的先進先出正好相反。 最近在學習資料結構和演算法,於是自己來實現。我特別喜歡C語言的指標,我發現很好用,於是用C++來實現一個簡單的範例。

C++中陣列連結串列vector等容器之間的區別

1. 各個容器之間區別 ① vector   (連續的空間儲存,可以使用[]操作符)快速的訪問隨機的元素,快速的在末尾插入元素,但是在序列中間歲間的插入,刪除元素要慢,而且如果一開始分配的空

陣列連結串列雜湊表

陣列和連結串列的區別: 1、陣列是將元素在記憶體中連續存放。 連結串列中的元素在記憶體中不是順序儲存的,而是通過存在元素中的指標聯絡到一起。 2、陣列必須事先定義固定的長度,不能適應資料動態地增減的情況。 連結串列動態地進行儲存分配

基於連結串列的遍歷

#include<bits/stdc++.h> using namespace std; typedef struct node { char data; struct no

【資料結構】陣列連結串列佇列

陣列 陣列儲存的資料在地址空間上是連續的。 方便資料的查詢,查詢資料的時間複雜度為O(1)。 連結串列 連結串列儲存的資料在地址空間上可連續,可不連續。 連結串列中的每一個節點都

陣列連結串列堆疊佇列

資料結構:是指相互之間存在一種或多種特定關係的資料元素的集合。聽起來是不是很抽象,簡單理解:資料結構就是描述物件間邏輯關係的學科。比如:佇列就是一種先進先出的邏輯結構,棧是一種先進後出的邏輯結構,家譜是一種樹形的邏輯結構!(初學資料結構的時候很不理解為什麼有“棧”這個東西

劍指Offer 26. 搜尋與雙向連結串列搜尋

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。 題目地址 https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=1

leetcode-有序連結串列轉換搜尋

有序連結串列轉換二叉搜尋樹 這道題需要定義三個指標,通過快慢指標找出中點,作為根節點,然後從頭指標head->指標last這段連結串列再遞迴呼叫sortedListToBST函式,從slow指標下一個節點開始到最後,作為後一個連結串列再進行遞迴呼叫函式sortedListToBST

有序連結串列搜尋

給定一個單鏈表,其中的元素按升序排序,將其轉換為高度平衡的二叉搜尋樹。 本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。 示例: 給定的有序連結串列: [-10, -3, 0, 5, 9], 一個可能的答案是:

4

1、樹和二叉樹的一些基本知識點 1.1、樹 一種非線性結構。樹是遞迴結構,在樹的定義中又用到了樹的概念。 1.1.1、樹的基本術語: 樹結點:包含一個數據元素及若干指向子樹的分支; 孩子結點:結點的子樹的根稱為該結點的孩子; 雙親結

LeetCode-109.有序連結串列轉換搜尋(相關話題:深度優先)

給定一個單鏈表,其中的元素按升序排序,將其轉換為高度平衡的二叉搜尋樹。 本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。 示例: 給定的有序連結串列: [-10, -3, 0, 5, 9], 一個可能的答案是:[0, -3,

有序連結串列轉換搜尋 leetcode

給定一個單鏈表,其中的元素按升序排序,將其轉換為高度平衡的二叉搜尋樹。 本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。 示例: 給定的有序連結串列:

LeetCode 109——有序連結串列轉化搜尋

1. 題目 2. 解答 2.1. 方法一 在 LeetCode 108——將有序陣列轉化為二叉搜尋樹 中,我們已經實現了將有序陣列轉化為二叉搜尋樹。因此,這裡,我們可以先遍歷一遍連結串列,將節點的資料存入有序陣列中,然後再將有序陣列轉化為二叉搜尋樹即可。 class Solution { publ

leetcode 109. 有序連結串列轉換搜尋

題目描述:給定一個單鏈表,其中的元素按升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例:給定的有序連結串列: [-10, -3, 0, 5, 9], 一個可能的答案是:[0, -3,

[LeetCode] Convert Sorted List to Binary Search Tree 將有序連結串列轉為搜尋

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 這道題是要求把有序連結串列轉為二叉搜尋樹,和之前那道Convert Sorted