Идея 1
Если вам нужно сравнить несколько списков required
, вы можете отсортировать входной список, а затем просто сравнить его путем итерации. Но сортировка, конечно, не слишком быстрая, но и не слишком медленная. Но если вы сравните с несколькими обязательными списками, накладные расходы на сортировку могут быстро амортизироваться.
После сортировки массива сравнение становится тривиальным:
for(int i = 0; i < 14; i++)
if(arr[i] != required[i]) return false;
return true;
Идея 2
Или, если 14 целых чисел различны / уникальны, вы можете просто сделать required
HashSet и сделать
input.Count(i => required.Contains(i)) == 14
Но я не знаю, фактически не проверив, если это быстрее, чем сортировка.
Идея 3
Вычислите быстрый хеш, который является инвариантным для перестановок в течение 14 дюймов, и сравните его с известным значением require
. Только в случае совпадения хешей более дорогое сравнение.
//Prepare/precalculated
int[] hashes = new int[34];
Random random = new Random();
for(int i = 0; i < 34; i++)
hashes[i] = random.NextInt();
//On each list
int HashInts(int[] ints)
{
int result = 0;
foreach(int i in ints)
result += hashes[i - 1];
return result;
}
Мудрый выбор значений для hashes
может немного улучшить его, но случайные значения должны быть в порядке.
Идея 4
Создайте гистограмму:
int[] CreateHistogram(int[] ints)
{
int[] counts = new int[34];
foreach(int i in ints)
{
counts[i - 1]++;
}
return counts;
}
Вы можете избежать создания массива, повторно используя существующий массив, если производительность действительно важна.