结构:
struct info{
int id;
int time;
int x;
int y;
};
结构数组将始终遵循以下条件:
时间变量将始终以相应的ID分类给出
如果变量:time
,x
,y
相等且id
不同,则认为重复
通过查找两个不同的id值进行搜索
示例1:找到对的副本 - 001 002
struct info *arr = {{002, 10, 30, 40}, {001, 10, 30, 40}, {001, 15, 45, 50}, {001, 20, 23, 37}}
输出:重复对将位于0&位置1
示例2:查找对的副本 - 001 002
struct info *arr = {{002, 15, 45, 50}, {002, 16, 21, 13}, {001, 10, 30, 40}, {001, 15, 45, 50},}
输出:重复对将位于0&位置3
示例3:查找对的副本 - 003 004
struct info *arr = {{004, 6, 47, 52}, {003, 6, 47, 52}, {001, 10, 30, 40}, {002, 15, 45, 50},}
输出:重复对将位于0&位置1
是否有可能在O(n^2)
时间内解决这个问题?
答案 0 :(得分:4)
可能是一个简单的解决方案:对数组进行排序为O(n*log(n))
,然后找到重复的条目就是一个复杂的O(n)
循环。总而言之,O(n*log(n))
的复杂性低于您想要击败的O(n^2)
。希望它有所帮助。
答案 1 :(得分:3)
在哈希表中添加N个元素可以在O(N)中完成,因此可以在O(N)中完成。
Perl的工作演示:
#!/usr/bin/perl
use strict;
use warnings qw( all );
my @infos = (
{ id => '002', time => 10, x => 30, y => 40 },
{ id => '001', time => 10, x => 30, y => 40 },
{ id => '001', time => 15, x => 45, y => 50 },
{ id => '001', time => 20, x => 23, y => 37 },
);
my %seen;
for my $i (0..$#infos) {
my $info = $infos[$i];
my $key = join(':', $info->{time}, $info->{x}, $info->{y});
push @{ $seen{$key} }, $i;
}
for my $matches (values(%seen)) {
next if @$matches == 1;
print("Duplicates:\n");
for my $i (@$matches) {
my $info = $infos[$i];
printf(" %d %s %d %d %d\n", $i, @$info{qw( id time x y )});
}
}
输出:
Duplicates:
0: 002 10 30 40
1: 001 10 30 40