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

Algorithm 我需要一个算法来查看3个列表,并找到唯一的项目,algorithm,list,language-agnostic,Algorithm,List,Language Agnostic,我已经搔头好几个小时了,需要一些帮助 我有3个对象列表。每个列表可以包含相同的对象(但不是必须包含)。我想要一个算法来测试每个列表中是否至少有一个唯一的对象 编辑:一个项目只能在每个列表中出现一次,但可以出现在多个列表中 编辑:有一个伪第四个列表-三个列表中各有一个项目。这是必须包含唯一性的列表。每个列表中总共可能有3个项目。这应该返回true,因为第四个列表可能包含unique 编辑:这是我到目前为止提出的,但我不知道这有多有效,甚至不知道它是否有效 bool Uniques( List<

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

我有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;
}
bool Uniques(列表1、列表2、列表3){
foreach(列表1中的项目1){
foreach(列表2中的项目2){
如果(项目1!=项目2){
foreach(列表3中的项目3){
如果(item3!=item1&&item3!=item2)返回true;
}
}
}
}
返回false;
}
编辑:为了举例说明,这里有一个例子。
从一个完整的颜色列表:红色,绿色,蓝色,黄色,青色,洋红,白色,黑色,橙色,紫色

列表1包含红色、绿色
列表2包含红色
列表3包含蓝色、橙色
结果是错误的

列表1包含红色、绿色
列表2包含红色、绿色
列表3包含红色、绿色
结果是错误的

列表1包含红色、绿色
列表2包含黄色
列表3包含红色、绿色

结果为真

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


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

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

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

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>=2
)。现在,从长度
l_3
列表中选择一个元素
x_3
,不同于
x_1
x_2
。同样,您可以选择这样的元素,因为列表至少有三个不同的元素

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

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

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

将它们全部添加到一个集合中?是否“唯一”意味着它在其列表中只出现一次,或者只出现在一个列表中,或者同时出现在两个列表中?解决方案需要有多高的效率?在使用额外空间方面有什么限制吗?从时间上讲,这是非常有效的,但是每个列表中不会有数百个项目,所以不要认为空间会是一个太大的问题。我想“项目3”中有一个错误=项目1和项目3=item1':)我理解这一点,但如何确定每个列表中是否至少有一个唯一的项?不管该项目是在2个列表中还是在3个列表中,只要每个列表中至少存在1个项目,并且它们彼此都不同。例如,可能有3个项目,每个项目都在所有3个列表中。但正如我在其他地方所评论的,一个有效的唯一项可以在两个列表中。这是我感兴趣的组合:如果可以组合3个项目,每个列表1个,每个项目彼此不同,那么返回true。所以在某种程度上,有第四个列表,由列表1中的任何一项、列表2中的任何一项和列表3中的任何一项组成。这个列表必须包含唯一性。好吧,这次我完全重新设计了我的方法。有趣的是,我编辑的答案证明了你的算法需要恒定的时间,而且它是正确的。啊!这是有道理的!我认为第二部分基本上与问题中的代码相同,但您添加的重要部分是对列表长度的预先检查,这将很快消除彻底检查的必要性?请注意,即使没有事先检查,彻底检查也会很快发现唯一性,对吗?无论如何,你已经很好地为我澄清了一切!谢谢但每个项目都可以合法地列在2或3个列表上。我相信它现在已经被分类了,和我上面说的差不多,除非我遗漏了什么。谢谢