"HashSet" (数据结构)
"HashSet"
表示一个集合,其中的成员为普通表达式,成员资格则是用哈希函数计算的.
更多信息
- 哈希集合适用于存储一组唯一元素,并能提供高效的成员测试、插入和删除操作.
-
CreateDataStructure["HashSet"] 创建新的空 "HashSet" CreateDataStructure["HashSet",elems] 创建一个包含 elems 的新 "HashSet" Typed[x,"HashSet"] 指定 x 的类型为 "HashSet" - 对于类型为 "HashSet" 的数据结构,可进行以下操作:
-
ds["Complement",list] 从 ds 中删除出现在 list 中的元素 用时:O(n) ds["Copy"] 返回 ds 的副本 用时:O(n) ds["Elements"] 返回 ds 中的参数列表 用时:O(n) ds["EmptyQ"] 如果 ds 中没有元素则返回 True 用时:O(1) ds["Delete",x] 从 ds 中删除 x,如果 x 是元素,返回 True 用时:O(1) ds["DeleteAll"] 删除 ds 的所有元素 用时:O(n) ds["Insert",x] 将 x 添加到集合中,如果插入成功则返回 True 用时:O(1) ds["Intersection",list] 从 ds 中删除没有出现在 list 中的元素 用时: O(n) ds["Length"] 返回存储在 ds 中的元素的数量 用时: O(1) ds["MemberQ",x] 如果 x 是 ds 的元素则返回 True 用时: O(1) ds["Pop"] 从 ds 删除一个参数并复原 用时: O(1) ds["SubsetQ",ds1] 如果哈希集合 ds1 是 ds 的子集,则返回 True 用时: O(n) ds["Union",list] 将 list 中出现的元素添加到 ds 中 用时: O(n) ds["Visualization"] 返回 ds 的可视化 用时: O(n) - 还支持以下函数:
-
dsi===dsj 如果 dsi 等于 dsj 则为 True FullForm[ds] ds 的完全形式 Information[ds] 关于 ds InputForm[ds] ds 的输入形式 Length[ds] ds 的长度 Normal[ds] 将 ds 转换成普通表达式
范例
打开所有单元 关闭所有单元基本范例 (2)
可用 CreateDataStructure 创建新的 "HashSet":
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)
可用 CreateDataStructure 创建新的 "HashSet":
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 可用于测试两个哈希集合是否包含相同的元素,与顺序无关:
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)