Time of Update: 2017-01-19
本文執行個體講述了圖的遍曆中深度優先搜尋的C++實現方法,是一種非常重要的演算法,具體實現方法如下:首先,圖的遍曆是指從圖中的某一個頂點出發,按照某種搜尋方法沿著圖中的邊對圖中的所有頂點訪問一次且僅訪問一次。注意到樹是一種特殊的圖,所以樹的遍曆實際上也可以看作是一種特殊的圖的遍曆。圖的遍曆主要有兩種演算法:廣度優先搜尋(Breadth-First-Search)和深度優先搜尋(Depth-First-Search)。一、深度優先搜尋(DFS)的演算法思想深度優先搜尋演算法所遵循的搜尋策略是儘可能
Time of Update: 2017-01-19
本文主要敘述了圖的遍曆演算法中的廣度優先搜尋(Breadth-First-Search)演算法,是非常經典的演算法,可供C++程式員參考借鑒之用。具體如下:首先,圖的遍曆是指從圖中的某一個頂點出發,按照某種搜尋方法沿著圖中的邊對圖中的所有頂點訪問一次且僅訪問一次。注意到樹是一種特殊的圖,所以樹的遍曆實際上也可以看作是一種特殊的圖的遍曆。圖的遍曆主要有兩種演算法:廣度優先搜尋(Breadth-First-Search)和深度優先搜尋(Depth-First-Search)。一、廣度優先搜尋(BFS
Time of Update: 2017-01-19
一個n個元素組成的集合中,第K個順序統計量(Order Statistic)指的是該集合中第K小的元素,我們這裡要討論的是如何線上性時間(linear time)裡找出一個數組的第K個順序統計量。該問題的演算法對於C++程式員來說有一定的借鑒價值。具體如下:一、問題描述:問題:給定一個含有n個元素的無序數組,找出第k小的元素。k = 1 :最小值k = n :最大值k = ⌊(n+1)/2⌋ or ⌈(n+1)/2⌉
Time of Update: 2017-01-19
前面的文章已經介紹了幾種排序演算法,如插入排序(直接插入排序,折半插入排序,希爾排序)、交換排序(冒泡排序,快速排序)、選擇排序(簡單選擇排序,堆排序)、2-路歸併排序(可以參考前一篇文章:各種內部排序演算法的實現)等,這些排序演算法都有一個共同的特點,就是基於比較。本文將介紹三種非比較的排序演算法:計數排序,基數排序,桶排序。它們將突破比較排序的Ω(nlgn)下界,以線性時間運行。一、比較排序演算法的時間下界所謂的比較排序是指通過比較來決定元素間的相對次序。“定理:對於含n個元素的一個輸入序列
Time of Update: 2017-01-19
相信學過資料結構與演算法的朋友對於快速排序應該並不陌生,本文就以執行個體講述了C++快速排序的分析與最佳化,對於C++演算法的設計有很好的借鑒價值。具體分析如下:一、快速排序的介紹快速排序是一種排序演算法,對包含n個數的輸入數組,最壞的情況已耗用時間為Θ(n2)[Θ 讀作theta]。雖然這個最壞情況的已耗用時間比較差,但快速排序通常是用於排序的最佳的實用選擇。這是因為其平均情況下的效能相當好:期望的已耗用時間為
Time of Update: 2017-01-19
當我們需要在後台讀取多個關鍵字時,我們可以先把背景資料庫讀取到一個數組中(在資料庫添加多個關鍵詞時用“,”隔開): 複製代碼 代碼如下: public string[] str; //添加一個公用數組一遍jquery調用 protected void Page_Load(object sender, EventArgs e) { string str1 = 讀取資料庫的關鍵詞; str=str1.Split(','); } 頁面的JQuery: <html s> <head &
Time of Update: 2017-01-19
在《編程珠璣》一書裡提到了一種演算法導論裡沒有提到過的位元影像排序方法,這種排序方法是通過犧牲空間效率來追求時間效率(線性時間)以達到時間-空間折中與雙贏的目的。本文以執行個體形式簡單講一下位元影像排序思想。一、問題描述 1.輸入:一個至多包含1千萬個非負整數的檔案 2.特徵:①每個數都是小於10000000的非負整數;②沒有重複的數字;③資料之間不存在關聯關係。 &
Time of Update: 2017-01-19
本文執行個體講述了C++實現堆排序演算法的方法,相信對於大家學習資料結構與演算法會起到一定的協助作用。具體內容如下: 首先,由於堆排序演算法說起來比較長,所以在這裡單獨講一下。堆排序是一種樹形選擇排序方法,它的特點是:在排序過程中,將L[n]看成是一棵完全二叉樹的順序儲存結構,利用完全二叉樹中雙親節點和孩子節點之間的內在關係,在當前無序區中選擇關鍵字最大(或最小)的元素。一、堆的定義堆的定義如下:n個關鍵字序列L[n]成為堆,若且唯若該序列滿足:①L(i) <= L(
Time of Update: 2017-01-19
本文詳細講述了C++實現二叉樹遍曆序列的求解方法,對於資料結構與演算法的學習有著很好的參考借鑒價值。具體分析如下:一、由遍曆序列構造二叉樹
Time of Update: 2017-01-19
C++中的動態數組(Dynamic Array)是指動態分配的、可以根據需求動態增長佔用記憶體的數組。為了實現一個動態數組類的封裝,我們需要考慮幾個問題:new/delete的使用、記憶體配置策略、類的四大函數(建構函式、拷貝建構函式、拷貝賦值運算子、解構函式)、運算子的重載。涉及到的知識點很多,對此本文只做簡單的介紹。一、記憶體配置策略當用new為一個動態數組申請一塊記憶體時,數組中的元素是連續儲存的,例如
Time of Update: 2017-01-19
一般來說,在C/C++的面試時,對於new/delete和malloc/free這兩對的使用和區別經常被考查到,如果這種基礎的問題都答不上來,估計很難過面試了。本文即是對new/delete和malloc/free這兩對的使用和區別較為簡單的分析一下,供大家參考。一、new和deletenew和delete是C++的運算子,用於動態分配記憶體和釋放記憶體。1.new運算式標準庫定義了operator new函數的幾個重載版本,沒有使用noexcept說明的版本在記憶體配置失敗時可能會拋出bad_
Time of Update: 2017-01-19
命名空間是C++非常重要的概念,本文就以執行個體形式對其進行深入分析,具體內容如下:通常來說,在C++中,命名空間(namespace)的目的是為了防止名字衝突。每個命名空間是一個範圍,在所有命名空間之外,還存在一個全域命名空間(global
Time of Update: 2017-01-19
模板特例化是C++程式設計中一個非常重要的應用,本文就以執行個體形式對其進行分析,相信對大家進一步理解C++程式設計能夠帶來一定的協助。具體內容如下:首先,模板是C++中一個很重要的特性,寫一份代碼能用於多種資料類型(包括使用者自訂類型)。例如,STL的sort()函數可以用於多種資料類型的排序,類stack可以用作多種資料類型的棧。但是,如果我們想對特定的資料類型執行不同的代碼(而不是通用模板)呢?這種情況下就可以使用模板特例化(template
Time of Update: 2017-01-19
本文執行個體展示了C++可變參數的函數與模板的實現方法,有助於大家更好的理解可變參數的函數與模板的應用,具體內容如下:首先,所謂可變參數指的是函數的參數個數可變,參數類型不定的函數。為了編寫能處理不同數量實參的函數,C++提供了兩種主要的方法:如果所有的實參類型相同,可以傳遞一個名為initializer_list的標準庫類型;如果實參的類型不同,我們可以編寫可變參數模板。另外,C++還有一種特殊的省略符形參,可以用它傳遞可變數量的實參,不過這種一般只用於與C函數互動的介面程式。一、可變參數函數
Time of Update: 2017-01-19
一、多態 C++多態通過繼承和動態綁定實現。繼承是一種代碼或者功能的傳承共用,從語言的角度它是外在的、形式上的,極易理解。而動態綁定則是從語言的底層實現保證了多態的發生——在運行期根據基類指標或者引用指向的真實物件類型確定調用的虛函數功能!通過帶有虛函數的單一繼承我們可以清楚的理解繼承的概念、物件模型的分布機制以及動態綁定的發生,即可以完全徹底地理解多態的思想。為了支援多態,語言實現必須在時間和空間上付出額外的代價(畢竟沒有免費的晚餐,更何況編譯器是毫無感情):1、類實現時增加了virtual
Time of Update: 2017-01-19
本文針對C++函數模板與類模板進行了較為詳盡的執行個體解析,有助於協助讀者加深對C++函數模板與類模板的理解。具體內容如下:泛型程式設計(Generic
Time of Update: 2017-01-19
本文以執行個體形式較為全面的講述了C++的多重繼承與虛繼承,是大家深入學習C++物件導向程式設計所必須要掌握的知識點,具體內容如下:一、多重繼承我們知道,在單繼承中,衍生類別的對象中包含了基類部分 和 衍生類別自訂部分。同樣的,在多重繼承(multiple inheritance)關係中,衍生類別的對象包含了每個基類的子物件和自訂成員的子物件。下面是一個多重繼承關係圖:class A{ /* */ }; class B{ /* */ }; class C : public A { /* */
Time of Update: 2017-01-19
本文較為深入的分析了C++中虛函數與純虛函數的用法,對於學習和掌握物件導向程式設計來說是至關重要的。具體內容如下:首先,物件導向程式設計(object-oriented
Time of Update: 2017-01-19
學習過C++的人都知道,extern關鍵字可以置於變數或者函數前,以標示變數或者函數的定義在別的檔案中,提示編譯器遇到此變數和函數時在其他模組中尋找其定義。這裡起到的是聲明作用範圍的用處。另外,extern還可以與”C”連用,作為連結指示。本文就此進行執行個體說明如下:一、C++名字修飾(Name
Time of Update: 2017-01-19
雖說C++是向後相容C的,但C++與C還是存在許多差異。本文列舉了幾個例子加以說明,同時這些也是我們非常容易忽略的地方。本文僅簡單的列舉幾例,更多的不同之處讀者還需要在學習與實踐中不斷的進行發掘和總結。C編譯通過但C++編譯不通過:1、C++中編譯器不允許在一個函式宣告之前調用它,但C中編譯器是允許的。#include<stdio.h> // 請用gcc和g++分別進行編譯 int main() { foo(); // foo()在它的聲明/定義之前被調用 } int