數據結構怎么學_什么是數據結構_平凡的程序員
本文關鍵詞:數據結構,由筆耕文化傳播整理發(fā)布。
一步一步寫算法(之 算法總結)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 自10月初編寫算法系列的博客以來,陸陸續(xù)續(xù)以來寫了幾十篇。按照計劃,還有三個部分的內容沒有介紹,主要是(Dijkstra算法、二叉平衡樹、紅黑樹)。這部分會在后面的博客補充完整。這里主要是做一個總結,有興趣的朋友可以好好看看,歡迎大家提出寶貴意見。 (1)...
一步一步寫算法(之 最大公約數、最小公倍數)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 求解最小公倍數和最大公約數是我們開始編程的時候經常需要練習的題目。從題面上看,好像我們需要求解的是兩個題目,但其實就是一個題目。那就是求最大公約數?為什么呢?我們可以假想這兩個數m和n,假設m和n的最大公約數是a。那么我們可以這樣寫: m = b *a;...
一步一步寫算法(之 可變參數)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 可變參數是C語言編程的一個特色。在我們一般編程中,函數的參數個數都是確定的,事先定下來的。然而就有那么一部分函數,它的個數是不確定的,長度也不一定,這中間有什么秘密嗎? 其實,我們可以回憶一下哪些函數是可變參數的函數?其實也就是sprintf、printf這樣的函數...
一步一步寫算法(之 A*算法)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 在前面的博客當中,其實我們已經討論過尋路的算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選一個算法,就是說要把這個唯一的路徑選出來,怎么選呢?當時我們就是采用窮盡遞歸的算法。然而,今天的情形有點不太一樣了。在什么地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地...
一步一步寫算法(之克魯斯卡爾算法 下)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面在討論克魯斯卡爾的算法的時候,我們分析了算法的基本過程、基本數據結構和算法中需要解決的三個問題(排序、判斷、合并)。今天,我們繼續(xù)完成剩下部分的內容。合并函數中,我們調用了兩個基本函數,find_tree_by_index和delete_mini_tree_from_gr...
一步一步寫算法(之克魯斯卡爾算法 中)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面說到,克魯斯卡爾的算法是按照各個line的權重依次進行添加的,那么這就涉及到一個權重的排序問題。怎么排序呢?可以采用最簡單的冒泡排序算法?墒沁@里排序的是數據結構,怎么辦呢?那就只好采用通用排序算法了。 void bubble_sort(void* array[],...
一步一步寫算法(之克魯斯卡爾算法 上)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 克魯斯卡爾算法是計算最小生成樹的一種算法。和prim算法(上,中,下)按照節(jié)點進行查找的方法不一樣,克魯斯卡爾算法是按照具體的線段進行的。現在我們假設一個圖有m個節(jié)點,n條邊。首先,我們需要把m個節(jié)點看成m個獨立的生成樹,并且把n條邊按照從小到大的數據進行排列。在n條邊中,我...
一步一步寫算法(之 回數)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 回數的概念比較好玩,就是說有這么一個字符串str, 長度為n, 現在index開始從0->index/2遍歷,那么str[index] = str[n-1-index],那么這種數據就是我們通常說的回數。比如說a = “a”是回數, a = “aba”是回數, a = "st...
一步一步寫算法(之哈夫曼樹 下)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面說到了哈夫曼樹的創(chuàng)建,那下面一個重要的環(huán)節(jié)就是哈夫曼樹的排序問題。但是由于排序的內容是數據結構,因此形式上說,我們需要采用通用數據排序算法,這在我之前的博客里面已經涉及到了(通用算法設計)。所以,我們所要做的就是編寫compare和swap兩個函數。通用冒泡代碼如下所示,...
一步一步寫算法(之哈夫曼樹 上)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 在數據傳輸的過程當中,我們總是希望用盡可能少的帶寬傳輸更多的數據,哈夫曼就是其中的一種較少帶寬傳輸的方法。哈夫曼的基本思想不復雜,那就是對于出現頻率高的數據用短字節(jié)表示,對于頻率比較低得數據用長字節(jié)表示。 比如說,現在有4個數據需要傳輸,分別為A、B、C、D,所...
一步一步寫算法(之通用數據結構)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 上一篇博客介紹了通用算法,那么有了這個基礎我們可以繼續(xù)分析通用數據結構了。我們知道在c++里面,既有數據又有函數,所以一個class就能干很多事情。舉一個簡單的例子來說,我們可以編寫一個數據的class計算類。 class calculate{ int m; int...
一步一步寫算法(之通用算法的編寫)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面我們寫過各種各樣的算法,什么排序、查找、二叉樹、隊列、堆棧等等。但是我們在編寫這些代碼的時候卻都有一個缺點,不知道大家發(fā)現了沒有?那就是這些算法中使用的數據結構都是簡單的int數據。所以,如果排序的是int,那么用起來沒有什么問題。關鍵就是萬一是其他的數據類型,那我們應該...
一步一步寫算法(之鏈表重合)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 鏈表重合是一個好玩的問題。原題目是這樣的:有兩個鏈表,那么如何判斷這兩個鏈表是不是重合的?至于這個鏈表在什么時候重合的,這不重要,關鍵是判斷這個鏈表究竟有沒有重合。究竟有什么方法呢? 最簡單的方法就是查看兩者有沒有共同點。那么依次判斷就行了。 int find...
一步一步寫算法(之尋找丟失的數)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 假設我們有一個1億個數據,其中數據的范圍是0~1億,也就是100M的數據。但是這個數組中丟了一些數據,比如說少了5啊,少了10啊,那么有什么辦法可以把這些丟失的數據找回來呢?這個題目不難,但是它可以幫助我們拓展思路,不斷提高算法的運行效率。 對于這個問題,我們一個最...
一步一步寫算法(之prim算法 下)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前兩篇博客我們討論了prim最小生成樹的算法,熟悉了基本的流程;旧蟻碚f,我們是按照自上而下的順序來編寫代碼的。首先我們搭建一個架構,然后一步一步完成其中的每一個子功能,這樣最后構成一個完成prim算法計算過程。 f)將DIR_LINE隊列中不符合的數據刪...
一步一步寫算法(之prim算法 中)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 C)編寫最小生成樹,涉及創(chuàng)建、挑選和添加過程 MINI_GENERATE_TREE* get_mini_tree_from_graph(GRAPH* pGraph) { MINI_GENERATE_TREE* pMiniTree; DIR_LINE pDirLine...
一步一步寫算法(之prim算法 上)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面我們討論了圖的創(chuàng)建、添加、刪除和保存等問題。今天我們將繼續(xù)討論圖的一些其他問題,比如說如何在圖的環(huán)境下構建最小生成樹。為什么要構建最小生成樹呢?其實原理很簡單。打個比方,現在某一個鄉(xiāng)鎮(zhèn)有n個村,那么這n個村肯定是聯通的,F在我們打算在各個村之間搭建網線,實現村村通的工程。...
一步一步寫算法(之函數堆棧顯示)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com 】 在繼續(xù)圖的討論之前,我們今天開個小差,討論一下函數堆棧的基本原理。有過編程經驗的朋友都知道,堆棧調試是我們在程序開發(fā)中經常應用的一個功能。那么大家有沒有想過,函數堆棧是怎么開始的啊?其實我們可以自己寫一個函數堆棧輸出函數分析一下。 因為一般來說,函數的壓棧過程是這...
一步一步寫算法(之圖的保存)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面的幾篇博客,我們對圖進行基本定義,同時介紹了圖的創(chuàng)建、圖的添加和刪除等。今天,我們聊一聊圖是怎么在存儲在外設中的。這些外接設備可以是各種類型的,比如說,可以是硬盤、sd卡、網絡硬盤等等。本質上說,我們今天討論的主題就是怎么把圖的數據永久地保留在本地。并且,如果需要加載這些...
一步一步寫算法(之圖添加和刪除)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面我們談到的圖的數據結構、圖的創(chuàng)建,今天我們就來說一說如何在圖中添加和刪除邊。邊的添加和刪除并不復雜,但是關鍵有一點需要記住,那就是一定要在小函數的基礎之上構建大函數,否則很容易出現錯誤。 一、邊的創(chuàng)建 邊的創(chuàng)建一般來說可以分為下面以下幾個步驟:...
一步一步寫算法(之圖創(chuàng)建)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面我們討論過圖的基本結構是什么樣的。它可以是矩陣類型的、數組類型的,當然也可以使指針類型的。當然,就我個人而言,比較習慣使用的結構還是鏈表指針類型的。本質上,一幅圖就是由很多節(jié)點構成的,每一個節(jié)點上面有很多的分支,僅此而已。為此,我們又對原來的結構做了小的改變: ty...
一步一步寫算法(之圖結構)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 圖是數據結構里面的重要一章。通過圖,我們可以判斷兩個點之間是不是具有連通性;通過圖,我們還可以計算兩個點之間的最小距離是多少;通過圖,我們還可以根據不同的要求,尋找不同的合適路徑。當然,有的時候為了計算的需要,我們還需要從圖中抽象出最小生成樹,這樣在遍歷計算的時候就不需要持...
一步一步寫算法(之“數星星”)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 學過編程的朋友都知道,當初為了學習編程語言中的各種語法結構,我們要試著解決各種各樣奇怪的題目。其中“數星星”就似乎其中的一種。什么是“數星星”呢?就是打印各種形狀的“*”,正三角、倒三角、菱形等等。本篇博客純粹為了紀念我們逝去的歲月。 a)正三角 void st...
一步一步寫算法(之字符串查找 下篇)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面我們談到了KMP算法,但是講的還不是很詳細。今天我們可以把這個問題講的稍微詳細一點。假設在字符串A中尋找字符串B,其中字符串B的長度為n,字符串A的長度遠大于n,在此我們先忽略。 假設現在開始在字符串A中查找,并且假設雙方在第p個字符的時候發(fā)現查找出錯了,也就是...
一步一步寫算法(之字符串查找 中篇)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 昨天我們編寫了簡單的字符查找函數。雖然比較簡單,但是也算能用。然而,經過我們仔細分析研究一下,這么一個簡單的函數還是有改進的空間的。在什么地方改進呢?大家可以慢慢往下看。 下面的代碼是優(yōu)化前的代碼,現在再貼一次,這樣分析起來也方便些: char* strstr...
一步一步寫算法(之字符串查找 上篇)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 字符串運算是我們開發(fā)軟件的基本功,其中比較常用的功能有字符串長度的求解、字符串的比較、字符串的拷貝、字符串的upper等等。另外一個經常使用但是卻被我們忽視的功能就是字符串的查找。word里面有字符串查找、notepad里面有字符串查找、winxp里面也有系統自帶的字符串的查...
一步一步寫算法(之鏈表排序)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 相比較線性表的排序而言,鏈表排序的內容稍微麻煩一點。一方面,你要考慮數據插入的步驟;另外一方面你也要對指針有所顧慮。要是有一步的內容錯了,那么操作系統會馬上給你彈出一個exception。就鏈表的特殊性而言,適合于鏈表的排序有哪些呢? (1)插入排序 (適合)...
一步一步寫算法(之哈希二叉樹)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 用過平衡二叉樹的朋友都清楚,平衡二叉樹的最大優(yōu)點就是排序。不管是在數據插入的時候還是在數據刪除的時候,我們都要考慮到數據的排序情況。但是和數據的添加、刪除一樣重要的,還有數據的查詢。很不幸,平衡二叉樹經常由于節(jié)點的添加和刪除,數據的查詢效率會變得非常低下。朋友們可以看看下面這...
一步一步寫算法(之二叉樹深度遍歷)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 深度遍歷是軟件開發(fā)中經常遇到的遍歷方法。常用的遍歷方法主要有下面三種:(1)前序遍歷;(2)中序遍歷;(3)后序遍歷。按照遞歸的方法,這三種遍歷的方法其實都不困難,前序遍歷就是根-左-右,中序遍歷就是左-根-右,后續(xù)遍歷就是左-右-根。代碼實現起來也不復雜。 1)前序遍歷void...
一步一步寫算法(之二叉樹廣度遍歷)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 在二叉樹的遍歷當中,有一種遍歷方法是不常見的,那就是廣度遍歷。和其他三種遍歷方法不同,二叉樹的廣度遍歷需要額外的數據結構來幫助一下?什么數據結構呢?那就是隊列。因為隊列具有先進先出的特點,這個特點要求我們在遍歷新的一層數據之前,必須對上一次的數據全部遍歷結束。暫時還沒有掌握隊...
一步一步寫算法(之尋路)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 尋路是游戲設計中需要使用到一種功能,那么我們怎么樣以一個點作為起始點,快速地尋找到目標點呢?其實尋路的方法不難。一種簡單有效的方法就是回溯法。如果我們從一個點出發(fā),那么這個點周圍肯定有若干條路,只要有一條路存在,我們就一直走下去,直到發(fā)現沒有路走為止;要是發(fā)現路走不下去了怎么...
一步一步寫算法(之排序二叉樹的保存和加載)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 排序二叉樹是我們開發(fā)中經常使用到的一種數據結構,它具有較好的插入、刪除、查找特性。但是由于二叉樹的指針較多,所以相比較其他的數據結構而言,二叉樹來得比較麻煩些。但是也不是沒有辦法,下面介紹一下我個人常用的方法。 我們知道,如果一個二叉樹是一個滿樹的話,那么二叉樹的節(jié)...
一步一步寫算法(之排序二叉樹線索化)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面我們談到了排序二叉樹,還沒有熟悉的同學可以看一下這個,二叉樹基本操作、二叉樹插入、二叉樹刪除1、刪除2、刪除3。但是排序二叉樹也不是沒有缺點,比如說,如果我們想在排序二叉樹中刪除一段數據的節(jié)點怎么辦呢?按照現在的結構,我們只能一個一個數據查找驗證,首先看看在不在排序二叉樹...
一步一步寫算法(之hash表)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 hash表,有時候也被稱為散列表。個人認為,hash表是介于鏈表和二叉樹之間的一種中間結構。鏈表使用十分方便,但是數據查找十分麻煩;二叉樹中的數據嚴格有序,...
一步一步寫算法(之挑選最大的n個數)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 從一堆數據中挑選n個最大的數,這個問題是網上流傳的比較廣的幾個問題之一。具體來說,它的意思就是:假設我們有100個數據,我們需要挑選出最大的n個數據(n 在前面的博客當中,我們實現的排序算法有下面幾種: (1) 冒泡排序、插入排序、希爾排序 (2) 快速排序 (...
一步一步寫算法(之八皇后)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 八皇后是一道很具典型性的題目。它的基本要求是這樣的:在一個8*8的矩陣上面放置8個物體,一個矩陣點只允許放置一個物體,任意兩個點不能在一行上,也不能在一列上,不能在一條左斜線上,當然也不能在一條右斜線上。 初看到這道題目,大家的第一印象是遍歷,但是經過實踐之后發(fā)現遍歷其實不好寫,而...
一步一步寫算法(之數據選擇)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 在數學中,有一些數據選擇的內容。舉個例子來說,有這樣一組數據:1、2、3、4,F在我們打算從中挑選出1個數據,那么有幾種選擇呢?結果應該是1、2、3、4;那么如果挑...
一步一步寫算法(之基數排序)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 基數排序是另外一種比較有特色的排序方式,它是怎么排序的呢?我們可以按照下面的一組數字做出說明:12、 104、 13、 7、 9 (1)按個位...
一步一步寫算法(之選擇排序)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 選擇排序是和冒泡排序差不多的一種排序。和冒泡排序交換相連數據不一樣的是,選擇排序只有在確定了最小的數據之后,才會發(fā)生交換。怎么交換呢?我們可以以下面一組數據...
一步一步寫算法(之單詞統計)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 在面試環(huán)節(jié)中,有一道題目也是考官們中意的一道題目:如果統計一段由字符和和空格組成的字符串中有多少個單詞? 其實,之所以問這個題目,考官的目的就是想...
一步一步寫算法(之爬樓梯)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前兩天上網的時候看到一個特別有意思的題目,在這里和朋友們分享一下: 有一個人準備開始爬樓梯,假設樓梯有n個,這個人只允許一次爬一個樓梯或者一次爬兩...
一步一步寫算法(之排序二叉樹刪除-3)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 3 普通節(jié)點的刪除 3.1 刪除的節(jié)點沒有左子樹,也沒有右子樹 測試用例1: 刪除節(jié)點6 /* * * 10 ======> 10 * / \...
一步一步寫算法(之排序二叉樹刪除-2)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 2.4 刪除節(jié)點的左右子樹都存在,此時又會分成兩種情形 1)左節(jié)點是當前左子樹的最大節(jié)點,此時只需要用左節(jié)點代替根節(jié)點即可 /* * * 10 ======> 6 * /...
一步一步寫算法(之排序二叉樹刪除-1)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 相比較節(jié)點的添加,平衡二叉樹的刪除要復雜一些。因為在刪除的過程中,你要考慮到不同的情況,針對每一種不同的情況,你要有針對性的反應和調整。所以在代碼編寫的過程中,我們可以一邊寫代碼,一邊寫測試用例。編寫測試用例不光可以驗證我們編寫的代碼是否正確,還能不斷提高我們開發(fā)代碼的自信心...
一步一步寫算法(之排序二叉樹插入)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 二叉樹的節(jié)點插入比較簡單。一般來說,二叉樹的插入主要分為以下兩個步驟: 1) 對當前的參數進行判斷,因為需要考慮到頭結點,所以我們使用了指針的指針...
一步一步寫算法(之排序二叉樹)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面我們講過雙向鏈表的數據結構。每一個循環(huán)節(jié)點有兩個指針,一個指向前面一個節(jié)點,一個指向后繼節(jié)點,這樣所有的節(jié)點像一顆顆珍珠一樣被一根線穿在了一起。然而今天...
一步一步寫算法(之洗牌算法)
【 聲明:版權所有,,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 撲克牌洗牌是我們生活中比較喜歡玩的一個游戲。那么我們有沒有什么辦法自己設計一個撲克牌洗牌的方法呢?在c運行庫當中有一個隨機函數rand,它可以生成0~327...
一步一步寫算法(之n!中末尾零的個數統計)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 在很多面試的題目中,求n!結果中零的個數也是經常遇到的一道題目。那么這道題目的解決方法究竟是什么呢?我愿意在此和大家分享一下我自己的一些看法,有不同見解的朋...
一步一步寫算法(之大數計算)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 我們知道在x86的32位cpu上面,int表示32位,如果核算成整數的話,大約是40多億。同樣,如果在64位cpu上面,能表示的最大整數就是64位二進制,表...
一步一步寫算法(之鏈表逆轉)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 鏈表逆轉是面試環(huán)境中經常遇到的一道題目,也是我們在實際開發(fā)中可能會遇到的開發(fā)需求。和線性逆轉不一樣,單向鏈表的節(jié)點需要一個一個進行處理。為了顯示兩者之間的區(qū)...
一步一步寫算法(之循環(huán)單向鏈表)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面的博客中,我們曾經有一篇專門講到單向鏈表的內容。那么今天討論的鏈表和上次討論的鏈表有什么不同呢?重點就在這個"循環(huán)"上面。有了循環(huán),意味著我們可以從任何一個鏈表節(jié)點開始工作,可以把root定在任何鏈表節(jié)點上面,可以從任意一個鏈表節(jié)點訪問數據,這就是循環(huán)的優(yōu)勢。...
一步一步寫算法(之雙向鏈表)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面的博客我們介紹了單向鏈表。那么我們今天介紹的雙向鏈表,顧名思義,就是數據本身具備了左邊和右邊的雙向指針。雙向鏈表相比較單向鏈表,主要有下面幾個特點: (1)在數據結構中具有雙向指針 (2)插入數據的時候需要考慮前后的方向的操作 (3)同樣,刪...
一步一步寫算法(之單向鏈表)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 有的時候,處于內存中的數據并不是連續(xù)的。那么這時候,我們就需要在數據結構中添加一個屬性,這個屬性會記錄下面一個數據的地址。有了這個地址之后,所有的數據就像一...
一步一步寫算法(之線性堆棧)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面我們講到了隊列,今天我們接著討論另外一種數據結構:堆棧。堆棧幾乎是程序設計的命脈,沒有堆棧就沒有函數調用,當然也就沒有軟件設計。那么堆棧有什么特殊的屬性呢?其實,堆棧的屬性主要表現在下面兩個方面: (1)堆棧的數據是先入后出 (2)堆棧的長度取決于棧頂的高度 那么,作...
一步一步寫算法(之線性隊列)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 這里的線性結構實際上指的就是連續(xù)內存的意思,只不過使用“線性”這個詞顯得比較專業(yè)而已。前面一篇博客介紹了現象結構的處理方法,那么在這個基礎之上我們是不是添加一些屬性形成一種新的數據結構類型呢?答案是肯定的,隊列便是其中的一種。 隊列的性質很簡單: (1)隊列有頭部和尾部...
一步一步寫算法(之線性結構的處理)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 我們知道,在內存中的空間都是連續(xù)的。也就是說,0x00000001下面的地址必然是0x00000002。所以,空間上是不會出現地址的突變的。那什么數據結構類...
一步一步寫算法(之堆排序)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 堆排序是另外一種常用的遞歸排序。因為堆排序有著優(yōu)秀的排序性能,所以在軟件設計中也經常使用。堆排序有著屬于自己的特殊性質,和二叉平衡樹基本是一致的。打一個比方說,處于大堆中的每一個數據都必須滿足這樣一個特性: (1)每一個array[n] 不小于array[2*n]...
一步一步寫算法(之合并排序)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 前面一篇博客提到的快速排序是排序算法中的一種經典算法。和快速排序一樣,合并排序是另外一種經常使用的排序算法。那么合并排序算法有什么不同呢?關鍵之處就體現在這...
一步一步寫算法(之快速排序)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 快速排序是編程中經常使用到的一種排序方法。可是很多朋友對快速排序有畏難情緒,認為快速排序使用到了遞歸,是一種非常復雜的程序,其實未必如此。只要我們使用好了方...
一步一步寫算法(之非遞歸排序)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 在上面一篇博客當中,我們發(fā)現普通查找和排序查找的性能差別很大。作為一個100萬的數據,如果使用普通的查找方法,那么每一個數據查找平均下來就要幾十萬次,那么二分法的查找呢,20多次就可以搞定。這中間的差別是非常明顯的。既然排序有這么好的效果,那么這篇博客中,我們就對排序算做一個...
一步一步寫算法(之查找)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 無論是數據庫,還是普通的ERP系統,查找功能數據處理的一個基本功能。數據查找并不復雜,但是如何實現數據又快又好地查找呢?前人在實踐中積累的一些方法,值得我們好好學些一下。我們假定查找的數據唯一存在,數組中沒有重復的數據存在。 (1) 普通的數據查找 設想有一個1M的數據,我們...
一步一步寫算法(之內存)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 內存是程序運行的基礎。所有正在運行的代碼都保存在內存里面。內存需要處理各種各樣的數據,包括鍵盤的數據、鼠標的數據、usb的數據、串口的數據、攝像頭的數據,那...
一步一步寫算法(之遞歸和堆棧)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 看過我前面博客的朋友都清楚,函數調用主要依靠ebp和esp的堆棧互動來實現的。那么遞歸呢,最主要的特色就是函數自己調用自己。如果一個函數調用的是自己本身,那么這個函數就是遞歸函數。 我們可以看一下普通函數的調用怎么樣的。試想如果函數A調用了函數B,函數B又調用了函數C,那么在堆棧中...
一步一步寫算法(之循環(huán)和遞歸)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 其實編程的朋友知道,不管學什么語言,循環(huán)和遞歸是兩個必須學習的內容。當然,如果循環(huán)還好理解一點,那么遞歸卻沒有那么簡單。我們曾經對遞歸諱莫如深,但是我想告訴...
一步一步寫算法(開篇)
【 聲明:版權所有,歡迎轉載,請勿用于商業(yè)用途。 聯系信箱:feixiaoxing @163.com】 算法是計算機的生命。沒有算法,就沒有軟件,計算機也就成了一個冰冷的機器,沒有什么實用價值。很多人認為,算法是數學的內容,學起來特別麻煩。我們不能認為這種觀點是錯誤的。但是我們也知道,軟件是一種復合的技術,如果一個人只知道算法,但是不能用編程語言很好地實現,那么再優(yōu)秀的算法也不能發(fā)揮作用。...
本文關鍵詞:數據結構,由筆耕文化傳播整理發(fā)布。
本文編號:65563
本文鏈接:http://www.sikaile.net/wenshubaike/xxkj/65563.html