精通的方法来检查3个变量是否都是唯一的

时间:2014-07-09 14:22:32

标签: algorithm perl optimization

我想写一个脚本来检查3个变量(A,B,C)是否都是唯一的并且彼此不相等。我想过做一个很大的if语句,如:

if (A != B) && (A != C) && (B != C){
    // do function }

我只是想知道是否还有其他办法?因为代码看起来很笨重。这是在Perl。

5 个答案:

答案 0 :(得分:10)

抽象复杂的细节(例如那些“看起来很笨拙”)是潜艇的要点。如果您不喜欢看到它,请将逻辑移动到子。就个人而言,对于我来说,三个变量看起来很好。

请注意,如果您要将代码移动到子代码,则可以考虑使用O(N)算法。你目前的方法规模很小(O(N 2 ))。

sub are_distinct {
   my %seen;
   ++$seen{$_} for @_;
   return keys(%seen) == @_;
}

优化退出:

sub are_distinct {
   my %seen;
   for (@_) {
      return 0 if $seen{$_}++;
   }

   return 1;
}

答案 1 :(得分:8)

您可以使用List::MoreUtils中的uniq函数获取所有唯一元素,然后将长度与原始元素数进行比较。

#!/usr/bin/perl 

use strict; 
use warnings; 

use List::MoreUtils qw(uniq); 

my ($A, $B, $C) = (1, 2, 3);
my @elems = ($A, $B, $C);

if ( uniq(@elems) == @elems ) {
   # do function
}

答案 2 :(得分:3)

你可以写一个函数,

sub all_unique {
  my %seen;
  return (@_ == grep !$seen{$_}++, @_);
}

if (all_unique($A, $B, $C)) { .. }

答案 3 :(得分:0)

有三个变量,没有什么真正“大”,只有三个比较。

如果你想推广更多的变量,比如说N,那么提高效率就变得有用了。

如果您进行详尽的比较,则需要进行N(N-1)/2次比较(例如N=10 -> 45)。

更好的方法是排序然后使用N-1比较(例如N = 10 - > 9:A!=B && B!=C && C!=D ...)。

答案 4 :(得分:-1)

我在.NET中使用HashSet<T>

执行此操作
var myVariables = new List<int> { A, B, C };
var hashset = new HashSet<int>(myVariables);
if (hashset.Count != myVariables.Count)
{
    // There was at least one duplicate value / hash collision
}

我想在PERL中有类似的数据结构,等等。 :)