当前位置: 首页 > 知识库问答 >
问题:

我需要一个算法来查看3个列表,并找到唯一的项目

黄正浩
2023-03-14

我已经挠头几个小时了,需要一些帮助...

我有3个对象列表。每个列表可以包含相同的对象(但不是必须包含)。我想要一个算法来测试每个列表中是否至少有一个唯一的对象。

编辑:一个项目只能在每个列表中出现一次,但可以出现在多个列表中。

编辑:有一个伪第四个列表-三个列表中各有一个项目。这是必须包含唯一性的列表。每个列表中总共可能有3个项目。这应该返回true,因为第四个列表可能包含unique。

编辑:这是我到目前为止提出的,但我不知道这有多有效,甚至不知道它是否有效!

bool Uniques( List<Item> list1, List<Item> list2, List<Item> list3 ) {
    foreach( Item item1 in list1 ) {
        foreach( Item item2 in list2 ) {
            if ( item1!=item2 ) {
                foreach( Item item3 in list3 ) {
                    if ( item3!=item1 && item3!=item2 ) return true;
                }
            }
        }
    }
    return false;
}

编辑:为了举例说明,这里有一个例子
从整体颜色列表中:红色、绿色、蓝色、黄色、青色、洋红、白色、黑色、橙色、紫色。

列表1包含红色,绿色
列表2包含红色
列表3包含蓝色,橙色
结果为FALSE

列表1包含红色,绿色
列表2包含红色,绿色
列表3包含红色,绿色
结果为FALSE

列表1包含红色,绿色
列表2包含黄色
列表3包含红色,绿色
结果为TRUE

共有3个答案

都乐逸
2023-03-14
set counter = 0
create empty list U
for each list L
    create D, a duplicate of list L
    for each list P, where P != L
        remove all items in P from D

    add all items in D to U
    if D is not empty, increment counter


if counter == number of lists, return U, else return empty list

当且仅当每个列表包含不在任何其他列表中的值时,返回的列表将为非空。如果为空,则为此类非共享值的集合

孟豪
2023-03-14

线性时间:使用散列。首先将列表1的每个elt散列为三个布尔值的数组,将第一个布尔值设置为true。对列表2和3重复上述步骤。瞧,您有一个散列,其键是元素,其值指示每个元素所属的列表。

然后,为了查看每个列表中是否至少有一个唯一的项,循环遍历散列值,检查三个bool中只有一个设置为true的数组。例如,如果一个值为[true,true,false],则忽略它,但如果一个值为[false,true,false],则您知道第二个列表具有唯一项。

西门逸仙
2023-03-14

编辑:由于对原始问题的误解,我基本上改变了我的答案。

由于我们知道每个列表元素在其列表中是唯一的,因此我们可以使用以下算法:

Compute the length of the three lists.
Sort these lengths into a tuple (l_1,l_2,l_3) in ascending order.

If l_1 >= 1 and l_2 >= 2 and l_3 >= 3, then answer 'YES'; 
else, 
    if among all possible combinations there is a valid one, 
    then, return 'YES', 
    otherwise return 'NO'. 

如果您事先知道列表的长度,则此算法需要固定的时间(否则它是线性的)。注意,当你检查所有可能的组合时,你只检查了不到6个三元组。

现在,证明这一点的证据非常简单:从长度列表中选择一个元素x_1,然后从长度列表中选择一个元素x_2,不同于x_1(这是可能的,因为l_2

我希望现在我真的解决了你要求的问题。

 类似资料:
  • 基本上,我需要这样的行列表: [0,0] [1,0],[0,1] [2,0],[1,1],[0,2] [3,0],[2,1],[1,2],[0,3] [4,0],[3,1],[2,2],[1,3],[0,4] 最多可添加任意数量的元素,然后再返回 [4,1],[3,2],[2,3],[1,4] [4,2],[3,3],[2,4] [4,3],[3,4] [4,4] 我只是希望所有这些对都在一个大的

  • 你好,伙计们,我想使我的列表视图这样,一个项目滚动一次和平滑。这里是我尝试到目前为止,但没有运气:(请帮助和感谢提前 自定义ListView类 }

  • 问题内容: 我有 N个 清单,我想找到它们的独特组合。我已经将其写在白板上,并且似乎都具有某种模式,但我还没有找到它。我觉得我可以表达一种蛮力方法,这肯定是我追求的目标。还有其他选择吗?不同的数据结构(二进制树)会使这样的工作更合适吗? 鉴于 : 结果将是: 鉴于 : 结果将是: 问题答案: 也许您正在寻找itertools.product: 请注意,乘积产生2 ** 5个元素。这是你想要的吗?

  • 我有这样的情况: 表一: 表二: 我需要把数量列在表2,使用“代码”作为关键字…谁能帮助我这个查询?我在用LibreOffice 预期结果

  • 我是新的Sublime的文本,但开始喜欢在它的工作。 我使用它的搜索和替换来实现如下: 我有一个清单,上面有数百个项目,如下所示: 但我想用 所以基本上冒号和单词应该用连字符(-)符号代替 我尝试了几个正则表达式。例如:(?)? 但事情并不顺利。

  • 问题内容: 我创建了一个无序列表。我觉得无序列表中的项目符号很麻烦,因此我想删除它们。 可以有没有项目符号的清单吗? 问题答案: 你可以通过设置除去子弹向在CSS的父元素(典型的是),例如: 您可能还需要增加和对,如果你想删除的缩进以及。