假设我们有一个元素集合,这些元素只有相同的运算符。所以,对它们进行排序是不可能的。
你怎么能挑选出那些有重复的东西并把它们放到每组中进行最少量的比较?最好是在C ++中,但算法比语言更重要。对于给出{E1,E2,E3,E4,E4,E2,E6,E4,E3}的示例,我希望提取出{E2,E2},{E3,E3},{E4,E4,E4}。您将选择哪种数据结构和算法?
修改
我的场景,如果二进制数据1等于二进制数据2,我们可以说这两个元素是相同的。但是,只有 = 和!= 是合乎逻辑的
element 1:
4 0 obj
<< /Type /Pages /Kids 5 0 R /Count 1 >>
stream
.....binary data 1....
endstream
endobj
element 2:
5 0 obj
<< /Type /Pages /Kids 5 0 R /Count 1 >>
stream
.....binary data 2....
endstream
endobj
答案 0 :(得分:3)
找到任意谓词P
就足够P(a,a)==false
,P(a,b) && P(b,a)==false
,P(a,b) && P(b,c)
暗示P(a,c)
和!P(a,b) && !P(b,a)
暗示{{} 1}}。然后更少 - 然后满足这个属性。但他们远非唯一的可能性。
您现在可以按谓词a == b
对集合进行排序,并且所有相等的元素都将相邻。在您的情况下,请定义P
等。
答案 1 :(得分:2)
对于你的答案,虽然我并非100%确定你想要这只是。
如果你想要好的算法,请尝试创建Binary search tree
。因为它是一个群组,根据BST properties
,您可以轻松地对元素进行分组。
例如
BST()
{
count = 0;
if(elementinserted)
count = 1;
if(newelement == already inserted element)
{
count++;
put element in array upto count value;
}
}
我希望这个解释可以帮助你。
答案 2 :(得分:2)
如果你所拥有的只是一个平等测试,你就没有希望。
假设您的每个元素都是唯一的。而另一个只有两个元素是重复的。
第二种类型有n(n+1)/2
。每个只能通过特定的比较来区分第一个。这意味着在最坏的情况下,您必须进行所有n(n+1)/2
比较:对所有对进行详尽搜索。
你需要做的是弄清楚你还能做些什么,因为平等只是非常罕见。