"HashSet" (データ構造)
"HashSet"
メンバが一般式であり,ハッシュ関数を使ってメンバシップが計算される集合を表す.
詳細
- ハッシュ集合は,一意的な要素の集合を整理するのに役立ち,メンバシップの非常に効率的な検証,挿入,削除を行うことができる.
-
CreateDataStructure["HashSet"] 新しい空の"HashSet"を作成する CreateDataStructure["HashSet",elems] elems を含む新しい"HashSet"を作成する Typed[x,"HashSet"] x に"HashSet"型を与える - "HashSet"型のデータ構造には,以下の演算が使える.
-
ds["Complement",list] list に現れる要素を ds から削除する time: O(n) ds["Copy"] ds のコピーを返す time: O(n) ds["Elements"] x を ds から削除し,x が実際に要素である場合にTrueを返す time: O(n) ds["EmptyQ"] ds からすべての要素を削除する time: O(1) ds["Delete",x] ds の要素のリストを返す time: O(1) ds["DeleteAll"] ds が要素を持たない場合はTrue time: O(n) ds["Insert",x] x を集合に加え,追加に成功した場合にはTrueを返す time: O(1) ds["Intersection",list] list に現れない要素を ds から削除する time: O(n) ds["Length"] ds に保存される要素の数を返す time: O(1) ds["MemberQ",x] x が ds のメンバである場合はTrue time: O(1) ds["Pop"] ds から要素を削除し,それを返す time: O(1) ds["SubsetQ",ds1] ハッシュ集合 ds1が ds の部分集合である場合にはTrueを返す time: O(n) ds["Union",list] list に現れる要素を ds に加える time: O(n) ds["Visualization"] ds の可視化を返す time: O(n) - 以下の関数もサポートする.
-
dsi===dsj dsi が dsj に等しい場合はTrue FullForm[ds] ds の完全形 Information[ds] ds についての情報 InputForm[ds] ds の入力形 Length[ds] ds の長さ Normal[ds] ds を通常の式に変換する
例題
すべて開く すべて閉じる例 (2)
新しい"HashSet"は,CreateDataStructureを使って作成できる:
ds = CreateDataStructure["HashSet"]ds["Insert", f[1]]ds["Length"]ds["MemberQ", f[1]]式が保存されていない場合には,Falseが返される:
ds["MemberQ", f[2]]要素を集合から削除する.要素がうまく削除された場合には,Trueを返す:
ds["Delete", f[1]]Normal[ds]ds = CreateDataStructure["HashSet"];
Do[ds["Insert", i], {i, 1000}]ds["Visualization"]スコープ (17)
情報 (1)
新しい"HashSet"は,CreateDataStructureを使って作成することができる:
ds = CreateDataStructure["HashSet"]Information[ds]作成 (2)
演算 (14)
"Complement" (1)
"Copy" (1)
初期要素を含む"HashSet"を作成する:
ds = CreateDataStructure["HashSet", Range[4]]ds1 = ds["Copy"]{Normal[ds], Normal[ds1]}ds1["Insert", 42];
{Normal[ds], Normal[ds1]}"Elements" (1)
"EmptyQ" (1)
"HashSet"が空かどうかをテストする:
ds = CreateDataStructure["HashSet"];
ds["EmptyQ"]ds["Insert", f[x]];
ds["EmptyQ"]"Delete" (1)
"DeleteAll" (1)
"HashSet"内の要素をすべて削除する:
ds = CreateDataStructure["HashSet", Range[300]];
ds["DeleteAll"]ds["EmptyQ"]"Insert" (1)
"Intersection" (1)
"Length" (1)
"MemberQ" (1)
"HashSet"内に要素が存在するかどうかをテストする:
ds = CreateDataStructure["HashSet", {f[x], f[y], f[z]}];
{ds["MemberQ", f[x]], ds["MemberQ", f[w]]}"Pop" (1)
初期要素を含む"HashSet"を作成する:
ds = CreateDataStructure["HashSet", {f[x], f[y], f[z]}];
ds["Elements"]ds["Pop"]"SubsetQ" (1)
"Union" (1)
"Visualization" (1)
初期要素を含む"HashSet"を作成する:
ds = CreateDataStructure["HashSet", Range[300]]ds["Visualization"]アプリケーション (2)
文字列集合 (1)
組込みの集合の演算は,機械数字の矩形配列を使う場合に便利である.データ構造の演算は,文字列等の数字ではないデータの集合に役立つ.1000000個の文字列のリストを作成する:
list1 = Table[ StringJoin[RandomChoice[ {"A", "B", "C"}, 4]], 1000000];ds = CreateDataStructure["HashSet"];
ds["Union", list1];//AbsoluteTimingUnion[list1];//AbsoluteTiminglist1 = Table[ StringJoin[ RandomChoice[ {"A", "B", "C"}, 10]], 100000];
listC = Table[ StringJoin[{"A", RandomChoice[ {"A", "B", "C"}, 9]}], 50];ds = CreateDataStructure["HashSet"];
ds["Union", list1];//AbsoluteTiminglistI = Union[list1];//AbsoluteTimingds["Complement", listC];//AbsoluteTimingComplement[listI, listC];//AbsoluteTimingグラフ閉路の検知 (1)
"HashSet"を使って有向グラフに閉路が含まれるかどうかを検知して,深さ優先探索走査中に訪れたノードを追跡する:
hasCycle[graph_ ? GraphQ] := Module[{
visited = CreateDataStructure["HashSet"],
recursionStack = CreateDataStructure["HashSet"],
dfs},
dfs[node_] := If[!visited["MemberQ", node],
visited["Insert", node];
recursionStack["Insert", node];
Do[
If[recursionStack["MemberQ", neighbor],
Return[True, Module]
,
dfs[neighbor]
],
{neighbor, VertexOutComponent[graph, node, {1}]}
];
recursionStack["Delete", node];
];
Scan[dfs, VertexList[graph]];
False
]以下のグラフが自己閉路を持たないグラフであるかどうかをチェックする:
hasCycle /@ {[image], [image], [image]}特性と関係 (5)
InputForm (1)
Length (1)
Normal (1)
SameQ (1)
SameQを使って,2つのハッシュ集合が順序は関係なく,同一の要素を含むかどうかをテストすることができる:
ds1 = CreateDataStructure["HashSet", Range[10]];
ds2 = CreateDataStructure["HashSet", Reverse@Range[10]];
ds1 === ds2ds1["Pop"];
ds1 === ds2"OrderedHashSet" (1)
"OrderedHashSet"に使えるアルゴリズムの多くは"HashSet"にも使える.
"OrderedHashSet"の場合とは違って,"HashSet"に要素が挿入される順序は保存されない.
履歴
2020 で導入 (12.1)