在未排序的结构数组中查找重复元素,然后小于O(n ^ 2) - C.

时间:2018-03-21 21:41:37

标签: c arrays algorithm struct

结构:

struct info{
    int id;
    int time;
    int x;
    int y;
};

结构数组将始终遵循以下条件:

  • 时间变量将始终以相应的ID分类给出

  • 如果变量:timexy相等且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)时间内解决这个问题?

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