一、簡介
作為乙個程式設計師,演算法是乙個永遠都繞不過去的話題,雖然在大學裡參加過acm的比賽,沒記錯的話,浙江賽區倒數第二,後來不知怎麼的,就不在care他了,但是現在後悔了,非常的後悔!!!如果當時好好學演算法的話,現在去理解一些高深的框架可能會很easy,現在隨著c#基礎和web技能的提公升,發現**都用到演算法,但是,很無奈.所以,從今天開始,要重新對自己定位,不能做乙個工具的使用者.起碼要做到知其所以然.好了,廢話不多說,演算法之旅,算是正式開始了.希望這個過程能貫穿我的整個職業生涯.甚至整個人生.
二、佇列
關於佇列,不多說,只要做了一兩年程式設計師,對他肯定不陌生,可以說**都有他.關於他的概念也很簡單.類似於我們生活中的排隊打飯,當然先排隊的肯定先打到飯.專業術語叫做先進先出.下面用基於object陣列的c#實現,**如下:
///控制台呼叫**如下:///自定義佇列
/// public
class
queue
//////
初始化指定容量的佇列
/// ///
public queue(int
capacity)
_array = new
object
[capacity];
_head = 0
; _tail = 0
; _size = 0
; }
//////
入隊
/// public
virtual
void enqueue(object
obj)
//////
出隊
/// ///
public
virtual
object
dequeue()
object result =_array[_head];
_array[_head] = null
; _head = _head + 1
; _size--;
return
result;
}//////
當前佇列的長度
/// public
int count }
}
class先進先出,但是有問題,上面給定初始長度為4,所以全域性陣列的長度為4,當你呼叫equeue方法5次,陣列會報溢位錯誤,所以,如果當前佇列的長度等於我們給它的初始值時,必須進行乙個陣列的copy操作,將當前陣列拷貝到乙個容量更大的陣列中去,這裡ms採用的演算法時,每次乘以2的遞增.修改**如下:program
,,,", q.dequeue(), q.dequeue(), q.dequeue(), q.dequeue());
console.readkey();}}
///ok,現在每次都會以原陣列*2的長度擴充套件原始陣列,但是還是有問題,如果這中間存在出隊,實際的_size會減一,但是陣列實際的長度還是為原來的,區別就是出隊的那個元素的位置會被設定為null,會存在以下bug:///自定義佇列
/// public
class
queue
//////
初始化指定容量的佇列
/// ///
public queue(int
capacity)
_array = new
object
[capacity];
_head = 0
; _tail = 0
; _size = 0
; }
//////
入隊
/// public
virtual
void enqueue(object
obj)
_array[_tail] =obj;
_tail = _tail + 1
; _size++;
}//////
出隊
/// ///
public
virtual
object
dequeue()
object result =_array[_head];
_array[_head] = null
; _head = _head + 1
; _size--;
return
result;
}//////
當前佇列的長度
/// public
int count }
//////
重新設定原始陣列的容量
/// private
void setcapacity(int
capacity)
}
var q = newqueue();
q.enqueue(1);
q.dequeue();
q.enqueue(2);
q.enqueue(3);
q.enqueue(4);
q.enqueue(5);
console.writeline(
"出隊:,,,
出隊,導致_size-1,但是原始陣列的長度還是為4,千萬不要說,dequeue的時候,讓第乙個元素的記憶體釋放陣列長度變為3,這是不可能的,至少我不知道.所以,這裡還需要對演算法進行改進.好了,到這裡我就做不下去了,看了ms的實現,估計是對陣列對了特殊的記憶體處理,沒有辦法處理出隊後第乙個元素為null,但是它還是會算到計算長度裡面去,如果引入新的變數去計算實際的長度,不用說,m目測會有記憶體浪費!mmp.如果你們有好的辦法,請告知.
C 資料結構與演算法系列 一 基本概念
在開始前先提出二個概念 時間複雜度與空間複雜度。時間複雜度是指該演算法的執行時間與問題規模的對應的關係。時間複雜度用t n 0 f n 來表示,其中0表示隨問題規模n的增大,演算法執行時間的增長率和f n 的增 長率相同,如果乙個沒有迴圈的 演算法的執行頻度是不會變的,記作0 1 當演算法中有乙個一...
演算法 基本資料結構
1 後進先出 2 棧有乙個屬性為s.top執行最新插入的元素 3 彈出稱為pop,插入稱為push 4 上溢和下溢 如果試圖對乙個空棧執行彈出操作,則稱為下溢 如果s.top超過了n,則稱為上溢,在下面偽 中不考慮上溢問題 1 先進先出 2 佇列有對頭head和對尾tail 3 插入稱為入隊 enq...
C 基本資料結構
目錄 c 基本資料結構 1.向量 2.佇列 3.棧以後會補充 include 順序儲存 empty size push back 尾部新增 pop back 尾部刪除 insert erase clear 首元素迭代器 begin 尾元素後乙個位置 end 訪問 1.0到size 1 2.定義迭代器...