"Deque" (データ構造)
"Deque"
先端と末尾の両方で追加と削除が行える式のキューを表す.
詳細
- デックは,先入れ先出しと後入れ先出しの挿入および削除の両方をサポートする要素の集合である:
-
CreateDataStructure["Deque"] 新しい空の"Deque"を作成する CreateDataStructure["Deque",elems] elems を含む新しい"Deque"を作成する Typed[x,"Deque"] x に"Deque"型を与える - "Deque"型のデータ構造には,以下の演算が使える.
-
ds["Copy"] ds のコピーを返す time: O(n) ds["DropAll"] ds からすべての要素を省く time: O(n) ds["Elements"] ds の要素のリストを返す time: O(n) ds["EmptyQ"] ds が空の場合にTrueを返す time: O(1) ds["Fold",fun,init] fun を ds の要素に適用する.init で始めて,結果を累積する time: O(n) ds["Length"] ds に含まれる要素の数 time: O(1) ds["PeekBack"] ds の最後の要素 time: O(1) ds["PeekFront"] ds の最初の要素 time: O(1) ds["PopBack"] ds の最後の要素を削除し,それを返す time: O(1) ds["PopFront"] ds の最初の要素を削除し,それを返す time: O(1) ds["PushBack",x] x を ds の末尾に加える time: O(1) ds["PushBackList",elems] elems を ds の末尾に加える time: O(nelems) ds["PushFront",x] x を ds の最初に加える time: O(1) ds["PushFrontList",elems] elems を ds の最初に加える time: O(nelems) ds["Visualization"] ds の可視化を返す time: O(n) - 以下の関数もサポートする.
-
dsi===dsj dsi が dsj に等しい場合はTrue FullForm[ds] ds の完全形 Information[ds] ds についての情報 InputForm[ds] ds の入力形 Normal[ds] ds を通常の式に変換する
例題
すべて開く すべて閉じる例 (2)
新しい"Deque"は,CreateDataStructureを使って作成できる:
ds = CreateDataStructure["Deque"]ds["EmptyQ"]ds["PushBack", f[1]]ds["EmptyQ"]ds["Length"]ds["PushFront", f[2]];
ds["PeekBack"]ds["PopBack"]Normal[ds]ds = CreateDataStructure["Deque"];
Do[ds["PushBack", i], {i, 1000}]ds["Visualization"]ds["Fold", Plus, 0]スコープ (1)
情報 (1)
新しい"Deque"は,CreateDataStructureを使って作成することができる:
ds = CreateDataStructure["Deque"]Information[ds]アプリケーション (1)
半順序集合の最小値 (1)
"Deque"は,半順序集合の最小値を計算するのに便利である.半順序集合は,要素が順序の関係を持たない場合にIndeterminateを返すことができる順序関数を必要とする.
以下は,順序関数について集合の最小値を返すか,最小値がない場合にIndeterminateを返すかする:
PartialMinimum[data_List, orderFun_] := Module[{list, len}, list = Range[Length[data]];
While[Length[list] > 1, len = Length[list];
list = PartialMinimumWorker[data, list, orderFun];
If[Length[list] === len, Return[Indeterminate]]];
data[[First[list]]]]PartialMinimumWorker[data_, curr_, orderFun_] := Module[{work, min, exchange = False}, work = CreateDataStructure["Deque"];
min = Fold[Function[{currVal, newVal}, Module[{d1, d2}, d1 = Part[data, currVal];
d2 = Part[data, newVal];
Switch[orderFun[d1, d2], 0, currVal, 1, currVal, -1, exchange = True;newVal, _, work["PushBack", newVal];currVal]]], curr];
If[exchange, work["PushFront", min], work["PushBack", min]];
Normal[work]]この順序関数はDivisibleを使う.つまり,数が互いで割り切れない場合には,Indeterminateの結果を返す:
order[x_, y_] := Which[Divisible[x, y], -1, Divisible[y, x], 1, True, Indeterminate]PartialMinimum[{2, 4, 6}, order]ここでは他の値に割り切ることができる数がないので,Indeterminateの結果が返される:
PartialMinimum[{2, 4, 3}, order]履歴
2020 で導入 (12.1)