資料結構與演算法 每天更新

2021-07-14 11:26:28 字數 3040 閱讀 1395

資料結構描述了資料元素之間的關係,通常分為集合、線性、樹型、圖型。集合描述了物件間沒有直接的關係,線性指之間關係一對一,樹型指的是一對多,圖型指的多對多。資料結構常見的有表、佇列、棧、樹、雜湊、堆、圖,每種資料結構都有多種表示,有的操作**編寫簡單,有的編寫麻煩。類如普通的二叉樹的一些新增、刪除操作比較簡單,但是對於平衡樹的這些操作,由於需要考慮平衡,導致**編寫困難。還有一些資料結構的編寫容易,但是需要一些演算法解決子問題。類如雜湊表,通常使用的是拉鍊法構建雜湊表,但是其中求雜湊值是個需要仔細設計的問題。另外對於不同的資料結構,可以使用不同的物理結構,類如表可以用陣列也可以用鍊錶來表示,這些導致不同資料結構的相同操作的時間複雜度不一樣,而且陣列並不一定優於鍊錶,鍊錶也不一定由於陣列。讓人遺憾的是,它兩沒有絕對勝出的,陣列在排序的情況下很方便檢索,時間複雜度在o(lgn),而鍊錶排序情況下也需要o(n)的時間,雖然是線性的,但在元素幾百萬、幾千萬後兩者區別可以明顯看出來。這個不能說明陣列就比鍊錶好,在插入與刪除的操作上,鍊錶又比陣列優,所以選擇什麼物理實現,必須具體問題具體分析,必要的時候可以進行實驗測試,看哪個執行時間快。下面對這幾種資料結構做乙個快速的分析。

#include 

#include

#include

template

class array

array(size_t capacity):m_size(0), m_capacity(capacity)

t operator(int index) const

void insert(int pos, t value)

void add(t element)

private:

void resize()

t *tmp = new t[2 * m_capacity];

assert(tmp);

memcpy(tmp, m_arr, m_size * sizeof(t));

delete m_arr;

m_arr = tmp;

m_capacity *= 2;

}private:

enum ;

t *m_arr;

size_t m_size;

size_t m_capacity;

};void testarraycase()

輸出:

300100

200program ended with

exit code: 0

上面使用了c標準庫的斷言,記憶體操作以及輸出,過載了運算子,使用c++的模板進行程式設計,後面的**都會對模板進行程式設計,可能有些型別需要進行特化,後面將引入迭代器。上面的testarraycase是乙個測試用例,寫的不全。上面用陣列實現的表提供了插入、新增、獲取的外部介面。這個結構只需要三個遍歷儲存一些必要資訊,有陣列的指標、陣列當前元素個數、陣列容量。還需要在陣列進行插入與新增時進行容量檢查,如果容量不夠,就重新申請一塊大一倍的記憶體。上面的memmove是安全的記憶體移動,在進行移動時,會把原記憶體拷貝乙份,然後再移動,所以不會出現覆蓋之前元素的情況。需要注意的是,陣列每次插入或者新增導致重新申請記憶體再拷貝之前的資料的時間複雜度是o(n),最壞情況之前n個數都需要進行後移。

#include

#include

<

string

.h>

#include

template

struct node

node *next;

node *pre;

t data;

};template

class list

node* add(t data)

else

return element;

}void insert(node

*p, t data)

node* begin()

node* next(node* p)

return p;

}node* end()

private:

node

*m_elements;

};void testlistcase()

}

上面的是雙向迴圈鍊錶,沒有使用表頭作為結束佔位符。上面同樣實現了新增與插入,陣列實現的插入提供的引數是元素位置,然後把元素插入這個位置,鍊錶是在節點的前面插入。這裡提供了獲得鍊錶第一元素、鍊錶尾,還有後移到下乙個元素。實現的介面不太漂亮,原因在於並沒有使用表頭節點作為佔位符表示結束,所以這裡不得不end()返回null,不然返回這個佔位符就可以了。

未完待續,持續更新中。

#include 

#include

#include

template

class queue

~queue()

}void enqueue(t elem)

m_arr[m_tail] = elem;

m_tail = ++m_tail % m_capacity;

}t dequeue()

void resize()

// tail is last position,it is used to check queue is full

m_tail = m_head + m_capacity - 1;

m_capacity *= 2;

delete m_arr;

m_arr = tmp;

}private:

enum ;

t *m_arr;

int m_head;

int m_tail;

int m_capacity;

};void testqueuecase()

for (int i=0; i<100; i++)

}

上面是用陣列實現的迴圈佇列,大小自動擴充套件,最後乙個元素的下乙個位置是哨兵,用來判斷佇列是否滿了,所以佇列滿的時候會有乙個位置不盛放元素,而作為隊尾,當

(m_tail+1)%m_capacity==m_head時表示佇列滿了,當m_tail==m_head時表示隊列為空。

資料結構與演算法 演算法 演算法和資料結構

資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...

每天學點python 資料結構和演算法

以下內容學習自 def select sort items,comp lambda x,y x y 簡單選擇排序 items items for i in range len items 1 min index i for j in range i 1,len items if comp items...

資料結構 資料結構與演算法01

1 求一組整數中的最大值。演算法 基本操作是 比較兩個數的大小 模型 仔細想想 你並不知道這個整數到底是多大?整數過大你該怎麼去表示?2 足協的資料庫管理的程式 演算法 需要管理的專案?如何管理?使用者介面?模型 3 資料與資料結構 資料 所有能被輸入到計算機中,並被計算機處理的符號的集合計算機操作...