algorithm - 给定一个对象 A 和一个对象列表 L,如何在不测试所有情况的情况下找出 L 上的哪些对象是 A 的克隆?

标签 algorithm data-structures hash functional-programming pattern-matching

使用 JavaScript 符号:

A = {color:'red',size:8,type:'circle'};

L = [{color:'gray',size:15,type:'square'},
     {color:'pink',size:4,type:'triangle'},
     {color:'red',size:8,type:'circle'},
     {color:'red',size:12,type:'circle'},
     {color:'blue',size:10,type:'rectangle'}];

这种情况的答案是 2,因为 L[2] 与 A 相同。您可以通过测试每种可能性在 O(n) 中找到答案。可以更快找到答案的表示/算法是什么?

最佳答案

我会创建一个 HashMap 并将所有对象放入 HashMap 中。我们还需要定义一个散列函数,它是对象中数据的函数(类似于在 java 中重写 Object.hashcode())

假设给定数组 L 是 [B, C, D],其中 B、C 和 D 是对象。那么 HashMap 就是 {B=>1, C=>2, D=>3}。现在假设 D 是 A 的副本。所以我们只需在这张 map 中查找 A 并获得答案。同样如 Eric P 在评论中所建议的那样,我们需要根据数组 L 中的任何更改更新 HashMap 。对于数组 L 中的每个操作,这也可以在 O(1) 中完成。

在 HashMap 中查找对象的成本是 O(1)。所以我们可以达到 O(1) 的复杂度。

关于algorithm - 给定一个对象 A 和一个对象列表 L,如何在不测试所有情况的情况下找出 L 上的哪些对象是 A 的克隆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12238788/

相关文章:

algorithm - GLua - 获取两个表之间的差异

haskell - 类型模式的名称 : R a b = Q (a -> (R a b, b))

arrays - 在 Ruby 中对多维字符串频率数组进行排序

python - 哈希表,非空槽已包含键,奇数数据值被新数据值替换

algorithm - 弹性/蛇行线算法

algorithm - 这个在图中寻找最大独立集的算法是否正确?

algorithm - 使用因式的第 k 个排列

java - 如何配对两个不同集合中的元素?

data-structures - 链表中的二分查找

c# - SHA256 在哈希中返回无效字符