一步一步寫演算法(之通用資料結構)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    上一篇部落格介紹了通用演算法,那麼有了這個基礎我們可以繼續分析通用資料結構了。我們知道在c++裡面,既有資料又有函數,所以一個class就能幹很多事情。舉一個簡單的例子來說,我們可以編寫一個資料的class計算類。class calculate{int m;int n;public:calculate():m(0),n(0) {}calculate(int a, int b):m(a),

一步一步寫演算法(之圖結構)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】     圖是資料結構裡面的重要一章。通過圖,我們可以判斷兩個點之間是不是具有連通性;通過圖,我們還可以計算兩個點之間的最小距離是多少;通過圖,我們還可以根據不同的要求,尋找不同的合適路徑。當然,有的時候為了計算的需要,我們還需要抽象出最小產生樹,這樣在遍曆計算的時候就不需要持續判斷是不是遇到了迴圈節點。當然,這所有的一切都是從圖的表示開始的。    1)矩陣表示  

一步一步寫演算法(之通用演算法的編寫)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    前面我們寫過各種各樣的演算法,什麼排序、尋找、二叉樹、隊列、堆棧等等。但是我們在編寫這些代碼的時候卻都有一個缺點,不知道大家發現了沒有?那就是這些演算法中使用的資料結構都是簡單的int資料。所以,如果排序的是int,那麼用起來沒有什麼問題。關鍵就是萬一是其他的資料類型,那我們應該怎麼辦呢?  

一步一步寫演算法(之哈夫曼樹 上)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】      在資料轉送的過程當中,我們總是希望用儘可能少的頻寬傳輸更多的資料,哈夫曼就是其中的一種較少頻寬傳輸的方法。哈夫曼的基本思想不複雜,那就是對於出現頻率高的資料用短位元組表示,對於頻率比較低得資料用長位元組表示。    比如說,現在有4個資料需要傳輸,分別為A、B、C、D,所以一般來說,如果此時沒有考慮四個資料出現的機率,那麼我們完全可以這麼分配,平均長度為2,/** A - 00

一步一步寫演算法(之圖建立)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    前面我們討論過圖的基本結構是什麼樣的。它可以是矩陣類型的、數群組類型的,當然也可以使指標類型的。當然,就我個人而言,比較習慣使用的結構還是鏈表指標類型的。本質上,一幅圖就是由很多節點構成的,每一個節點上面有很多的分支,僅此而已。為此,我們又對原來的結構做了小的改變:typedef struct _LINE{int end;int weight;struct _LINE*

一步一步寫演算法(之尋路)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】  

一步一步寫演算法(之哈夫曼樹 下)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    前面說到了哈夫曼樹的建立,那下面一個重要的環節就是哈夫曼樹的排序問題。但是由於排序的內容是資料結構,因此形式上說,我們需要採用通用資料排序演算法,這在我之前的部落格裡面已經涉及到了(通用演算法設計)。所以,我們所要做的就是編寫compare和swap兩個函數。通用冒泡代碼如下所示,void bubble_sort(void* array[], int length, int

一步一步寫演算法(之二叉樹廣度遍曆)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    在二叉樹的遍曆當中,有一種遍曆方法是不常見的,那就是廣度遍曆。和其他三種遍曆方法不同,二叉樹的廣度遍曆需要額外的資料結構來協助一下?什麼資料結構呢?那就是隊列。因為隊列具有先進先出的特點,這個特點要求我們在遍曆新的一層資料之前,必須對上一次的資料全部遍曆結束。暫時還沒有掌握隊列知識的朋友可以看一看我的這一篇部落格—隊列。  

一步一步寫演算法(之雜湊二叉樹)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    用過平衡二叉樹的朋友都清楚,平衡二叉樹的最大優點就是排序。不管是在資料插入的時候還是在資料刪除的時候,我們都要考慮到資料的排序情況。但是和資料的添加、刪除一樣重要的,還有資料的查詢。很不幸,平衡二叉樹經常由於節點的添加和刪除,資料的查詢效率會變得非常低下。朋友們可以看看下面這樣的一個極端情境,所有分支節點都只有一邊存在資料:/** 7 3* /

一步一步寫演算法(之二叉樹深度遍曆)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    深度遍曆是軟體開發中經常遇到的遍曆方法。常用的遍曆方法主要有下面三種:(1)前序走訪;(2)中序遍曆;(3)後序遍曆。按照遞迴的方法,這三種遍曆的方法其實都不困難,前序走訪就是根-左-右,中序遍曆就是左-根-右,後續遍曆就是左-右-根。代碼實現起來也不複雜。    1)前序走訪void preorder_traverse(TREE_NODE*

一步一步寫演算法(之鏈表排序)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    相比較線性表的排序而言,鏈表排序的內容稍微麻煩一點。一方面,你要考慮資料插入的步驟;另外一方面你也要對指標有所顧慮。要是有一步的內容錯了,那麼作業系統會馬上給你彈出一個exception。就鏈表的特殊性而言,適合於鏈表的排序有哪些呢?    (1)插入排序    (適合)    (2)冒泡排序    (適合)    (3)希爾排序    (適合)    (4)選擇排序    (適合)  

一步一步寫演算法(之 回數)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    回數的概念比較好玩,就是說有這麼一個字串str, 長度為n, 現在index開始從0->index/2遍曆,那麼str[index] = str[n-1-index],那麼這種資料就是我們通常說的回數。比如說a = “a”是回數, a = “aba”是回數, a =

一步一步寫演算法(之字串尋找 上篇)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】  

一步一步寫演算法(之克魯斯卡爾演算法 上)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】  

一步一步寫演算法(之字串尋找 中篇)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    昨天我們編寫了簡單的字元尋找函數。雖然比較簡單,但是也算能用。然而,經過我們仔細分析研究一下,這麼一個簡單的函數還是有改進的空間的。在什麼地方改進呢?大家可以慢慢往下看。    下面的代碼是最佳化前的代碼,現在再貼一次,這樣分析起來也方便些:char* strstr(const char* str, char* data){int index;int len;if(NULL ==

一步一步寫演算法(之克魯斯卡爾演算法 中)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    前面說到,克魯斯卡爾的演算法是按照各個line的權重依次進行添加的,那麼這就涉及到一個權重的排序問題。怎麼排序呢?可以採用最簡單的冒泡排序演算法。可是這裡排序的是資料結構,怎麼辦呢?那就只好採用通用排序演算法了。void bubble_sort(void* array[], int length, int (*compare)(void*, void*),

一步一步寫演算法(之克魯斯卡爾演算法 下)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    前面在討論克魯斯卡爾的演算法的時候,我們分析了演算法的基本過程、基本資料結構和演算法中需要解決的三個問題(排序、判斷、合并)。今天,我們繼續完成剩下部分的內容。合并函數中,我們調用了兩個基本函數,find_tree_by_index和delete_mini_tree_from_group,下面給出詳細的計算過程。MINI_GENERATE_TREE*

一步一步寫演算法(之字串尋找 下篇)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    前面我們談到了KMP演算法,但是講的還不是很詳細。今天我們可以把這個問題講的稍微詳細一點。假設在字串A中尋找字串B,其中字串B的長度為n,字串A的長度遠大於n,在此我們先忽略。    假設現在開始在字串A中尋找,並且假設雙方在第p個字元的時候發現尋找出錯了,也就是下面的情況:/* * A: A1 A2 A3 A4 ... Ap ............* B: B1

一步一步寫演算法(之 A*演算法)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的樣本圖中,可選的路徑是唯一的。我們挑選一個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選的過程中有一個要求,那就是挑選的路徑距離最短?有沒有什麼辦法呢?  

一步一步寫演算法(之“數星星”)

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】     學過編程的朋友都知道,當初為了學習程式設計語言中的各種文法結構,我們要試著解決各種各樣奇怪的題目。其中“數星星”就似乎其中的一種。什麼是“數星星”呢?就是列印各種形狀的“*”,正三角、倒三角、菱形等等。本篇部落格純粹為了紀念我們逝去的歲月。    a)正三角void star_1(){int outer;int inner;for(outer = 1; outer <10;

總頁數: 61357 1 .... 18797 18798 18799 18800 18801 .... 61357 Go to: 前往

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.