一起學習PHP中的DS資料結構擴充套件(二)

2022-09-10 18:15:22 字數 2409 閱讀 6154

上文中我們學習了 ds 擴充套件中一些比較常用的資料結構,也留下了一些伏筆,比如 map 中返回 keys() 和 values() 分別返回的是兩種特殊的資料結構,也就是我們今天要學習的內容。

最初見到 vector 還是在很早的時候在 j**a 中見過。不過即使是在 j**a 中,這個型別的資料結構的使用也並不多,因為在 j**a 中也是以 list 和 map 為主。我們先來看看這個集合是怎麼用的。

$vector = new \ds\vector(["a", "b", "c"]);

$vector->push("d");

$vector->push(5);

$vector->push(6);

$vector->push(7);

$vector->push(8);

$vector->set(3, "ccc");

var_dump($vector->get(3)); // string(3) "ccc"

var_dump($vector->pop()); // int(8)

$vector->unshift(1);

$vector->unshift(-1);

var_dump($vector->shift()); // int(-1)

$vector->insert(5, 'five');

var_dump($vector->get(5)); // string(4) "five"

var_dump($vector->get(6)); // int(5)

$vector->remove(6);

var_dump($vector->get(6)); // int(6)

var_dump($vector[4]); // string(3) "ccc"

$vector[4] = 'num 4.';

var_dump($vector[4]); // string(6) "num 4."

var_dump($vector);

// object(ds\vector)#1 (8)

它的很多方法和 map 都是類似的,不過它支援 push()、pop()、shift()、unshift() 這四種方法,也就是分別從尾部和頭部新增和取出資料。另外在底層,它使用的總記憶體會少於使用陣列,當分配的記憶體大小降到到足夠低的時候會自動釋放記憶體。對於 get()、set()、push()、pop() 這些方法的操作效率都能達到 o(1) 的水平,而對於 shift()、unshift()、insert()、remove() 這些操作則都是 o(n) 的水平。至於在什麼場景下使用就很清晰了,很大的陣列使用它可以節約記憶體,並且一些操作的效率還非常高。

在 map 中使用 values() 和 paris() 返回的就都是 vector 這個型別的集合。

set 這個集合結構其實挺常見的,不止是 j**a 這些程式語言中,redis 中也有這種儲存資料的方式,相信大家不會陌生。和其它結構最顯著的區別就是 set 中的值必須是唯一的。

$set = new \ds\set(["a", "b", "c"]);

$set->add("d");

$set->add("b");

var_dump($set);

// object(ds\set)#2 (4)

這個就不多做解釋了,相信大家就算沒有在**中用過,也會在 redis 的使用中接觸過,業務場景也非常多。在上篇文章中 map 返回的 keys() 資訊就是 set 結構的,因為 map 中的鍵是不能有重複的,包括數字下標的陣列其實也都是不能有重複的鍵值的。

雙端佇列其實在表現形式上和 vector 差不多,同樣可以在佇列的頭尾部進行增加取出操作,不過它有兩個指標分別指向佇列的頭尾部,所以它的 shift() 和 unshift() 的速度也是非常快的 o(1) 級別。

$deque = new \ds\deque(["a", "b", "c"]);

$deque->push("d");

$deque->unshift("z");

var_dump($deque);

// object(ds\deque)#3 (5)

var_dump($deque->pop()); // string(1) "d"

var_dump($deque->shift()); // string(1) "z"

今天介紹的內容相比上篇文章簡單很多,但上篇文章其實也只是測試的**結果展示的比較多而已。整體的 datastruct 擴充套件框架中的資料結構就是這些,就像最開始我們說過的,如果沒有特別的需求,只是需要用到棧或佇列的話,直接使用 spl 中的就可以了。而如果有特殊的需求,比如說 map 這種物件型別,又或者需要乙個節約記憶體的陣列,那麼 ds 中的這些資料結構想必會是你的好幫手。

測試**:

一起學習php中的ds資料結構擴充套件(二).php

一起學習PHP中的FTP操作

除了 上傳之外,在某些業務場景中,比如在雲服務還不是非常流行的年代,往往我們會把 大檔案這些素材存放到一台單獨的有著大容量硬碟的伺服器上。這時,在後台上傳這些檔案的時候,我們就需要使用 ftp 的功能將業務伺服器上傳的檔案再通過 ftp 服務傳輸到檔案伺服器中,這就是在業務環境下 ftp 最典型的應...

從零開始一起學C語言(九) 資料結構

目錄 一 資料結構的介紹 1 資料結構 2 資料結構的儲存方式 二 記憶體的動態開闢和釋放 1 記憶體的動態開闢 2 記憶體的動態釋放 三 鍊錶的建立 1 煉表頭的建立 四 鍊錶的讀和寫 1 建立任意數量的節點 2 鍊錶的寫 3 鍊錶的讀 五 鍊錶的插入 1 頭插法 2 尾插法 六 鍊錶的刪除 相互...

php的資料結構 PHP 資料結構演算法

基本資料結構演算法 二分查詢 陣列裡查詢某個元素 function bin sch array,low,high,k elseif k array mid elseelseelseelse return false return 0 查詢字串 function strstr str,substr m...