首頁  >  文章  >  後端開發  >  詳細介紹php中的Data Structures擴展

詳細介紹php中的Data Structures擴展

醉折花枝作酒筹
醉折花枝作酒筹轉載
2021-07-27 16:54:171755瀏覽

PHP中因為陣列太過強大,把這些資料結構都囊括進來了,所以不太需要去關注這些資料結構,久而久之這些概念也就淡化了。在PHP中有個擴充叫做Data Structures,這個擴充包含了這些常見的資料結構。今天就來介紹一下。

詳細介紹php中的Data Structures擴展

在PHP 中因為陣列太過強大,把這些資料結構都囊括進來了,所以不太需要去關注這些資料結構,久而久之這些概念也就淡化了,不是說PHP 沒有資料結構。

在 PHP 中有個擴充 Data Structures,這個擴充包含了這些常見的 資料結構。

PHP 資料結構

  • 優先權佇列PriorityQueue

  • 雙端佇列Deque

  • #佇列FIFO(先進先出)

  • #堆疊LIFO(先進後出)

  • ##散列表Hash

Set 集合

Map 字典

資料結構介紹
  • 優先權佇列PriorityQueue

    PriorityQueue 與Queue 非常相似。值被推入具有指定優先權的佇列中,具有最高優先權的值將始終位於佇列的前面。
  • 注意

對於具有相同優先權的值,保留「先進先出」順序。

迭代 PriorityQueue 是破壞性的,相當於連續彈出操作,直到佇列為空。

設定容量

預設容量是 8,可以手動設定容量,這個容量不是指佇列的長度,而是說儲存空間。再分配容量時確保有足夠的記憶體

如果該值小於或等於目前容量,容量將保持不變。

$queue = new Ds\PriorityQueue(); 
$queue->allocate(8);
取得容量

目前手動設定了容量時,如果設定的容量大於實際佔用容量,則傳回設定的容量。反之,返回實際的容量。

$queue = new Ds\PriorityQueue(); 
// 此时返回默认值 8
$queue->capacity();

設定優先權

數值越大優先權越高
    $queue = new Ds\PriorityQueue(); 
    $queue->push('value1', 1);
    $queue->push('value2', 2);
  • 範例

    $queue = new Ds\PriorityQueue(); 
    $queue->push('沙僧', 2);
    $queue->push('唐僧', 5);
    $queue->push('白龙马', 1);
    $queue->push('猪八戒', 3);
    $queue->push('孙悟空', 4);
    $cout = $queue->count();
    for($i=0; $i<$cout; $i++) {
      echo $queue->pop();
      echo PHP_EOL;
    }
    輸出
  • 唐僧
    孙悟空
    猪八戒
    沙僧
    白龙马
  • 應用場景

  • MySQL 查詢時為了加快查詢速度,避免排序無法使用索引,沒有進行排序,在服務端程式碼層面進行手動排序再回傳。

    其他應用程式場景...

    • 雙端佇列Deque

      有兩個指標分別指向頭部和尾部。分別可以在頭部和尾部進行插入和彈出。
    • 優點

    • 支援陣列語法(方括號)。

    • 對於相同數量的值,比陣列佔用更少的記憶體。

    當其大小下降到足夠低時,自動釋放分配的記憶體。

    • get()、set()、push()、pop()、shift()和unshift()都是O(1)。

    • 缺點

    設定的容量數值,必須是 2 的冪次方值,預設值是 8。例如2^2

    insert()和remove()是O(n)。

    類別方法說明

    雙端佇列Deque
    • #範例
    $deque = new Ds\Deque();
    $deque->push(...['唐僧', '孙悟空', '猪八戒', '沙僧', '白龙马']);
    $clone = $deque->copy();
    $count = $deque->count();
    echo '头:'.$deque->first().PHP_EOL;
    echo '尾:'.$deque->last().PHP_EOL;
    echo '--- 从队尾开始 ----'.PHP_EOL;
    for($i=0; $i<$count; $i++) {
        echo $deque->pop();
        echo PHP_EOL;
    }
    
    echo '--- 从队头开始 ----'.PHP_EOL;
    for($i=0; $i<$count; $i++) {
        echo $clone->shift();
        echo PHP_EOL;
    }
    輸出

    头:唐僧
    尾:白龙马
    --- 从队尾开始 ----
    白龙马
    沙僧
    猪八戒
    孙悟空
    唐僧
    --- 从队头开始 ----
    唐僧
    孙悟空
    猪八戒
    沙僧
    白龙马

    應用程式場景

    多種應用程式場景

    佇列FIFO(先進先出)

    佇列是「先進先出」或「FIFO」集合,它只允許訪問隊列前面的值。

    範例

    $queue = new Ds\Queue(); 
    $queue->push('唐僧');
    $queue->push(...['孙悟空', '猪八戒']);
    $queue->push(['沙僧', '白龙马']);
    print_r($queue);

    輸出

    Ds\Queue Object
    (
        [0] => 唐僧
        [1] => 孙悟空
        [2] => 猪八戒
        [3] => Array
            (
                [0] => 沙僧
                [1] => 白龙马
            )
    )

    堆疊LIFO(先進後出)

    Stack 是一個「後進先出」或「LIFO」集合,它只允許存取結構頂部的值。

    範例

    $Stack = new Ds\Stack(); 
    $Stack->push('唐僧');
    $Stack->push(...['孙悟空', '猪八戒']);
    $Stack->push(...['沙僧', '白龙马']);
    
    $cout = $Stack->count();
    for($i=0; $i<$cout; $i++) {
        echo $Stack->pop();
        echo PHP_EOL;
    }

    輸出
      白龙马
      沙僧
      猪八戒
      孙悟空
      唐僧
    • Map 字典

      Map 是鍵值對 [key=>value] 的順序集合,與陣列相似。鍵可以是任何類型,但必須是唯一的。如果使用相同的鍵將值新增至地圖,後面新增的則會取代先前的值。
    • 優點

    • 鍵和值可以是任何類型,包括物件

    • 支援陣列語法。

    • 保留插入順序。

    • 效能和記憶體效率與資料相似。

      • 當大小下降到足夠低時自動釋放分配的記憶體。

      缺點

      當物件作為鍵時,不能轉換為陣列。

      • Set 集合

        Set 是一系列唯一值,只有一組 key 不儲存 value,而且 key 不能重複。
      • 優點

      • 值可以是任何類型,包括物件。

      • 支援陣列語法。

      • 保留插入順序。

      當大小下降到足夠低時自動釋放分配的記憶體。

      • add()、remove()和contains()複雜度都是O(1)。

      • 缺點

      不支援push()、pop()、insert()、shift()或unshift()

      • 如果在被存取的索引之前緩衝區中有被刪除的值,則get()為O(n),否則為O(1)。

      • Map 和 Set 的差異

        ######。儲存方式不同。 Map 儲存的是[key => value] 形式,Set 儲存的是[...keys];############Map 和Set 都是透過key 來保證有序性的,所以是不允許修改key 的。 ###

      推薦學習:php影片教學

      #

      以上是詳細介紹php中的Data Structures擴展的詳細內容。更多資訊請關注PHP中文網其他相關文章!

      陳述:
      本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除