Линейный алгоритм поиска - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. И так, нужно найти элементы которые присутствуют только в массиве

a

или только в массиве

b

, то бишь исключить повторяющиеся элементы (массивы одномерные). Когда нужно было найти элементы присутствующие в обоих массивах использовался вот такой алгоритм
Листинг программы
  1. int[] c = new int[n + m];
  2. int count = 0;
  3. for (i = 0; i < a.Length; i++)
  4. {
  5. for (j = 0; j < b.Length; j++)
  6. {
  7. if (a[i] == b[j])
  8. {
  9. c[count] = a[i];
  10. count++;
  11. }
  12. }
  13. }
Но для выше поставленной задачи этот вариант не подходит, та как если просто написать
Листинг программы
  1. if (a[i] != b[j])
произойдет множественное дублирование. Есть конечно идея сравнивать каждый элемент a[i] со всеми элементами b[j], и уже после этого делать вывод по параметру
Листинг программы
  1. if (a[i] == b[j])
То бишь если нет ни одного схожего элемента, значит он уникальный и записываем в массив

c

. Но вот никак не получается это реализовать. Прошу помощи в данном вопросе.

Решение задачи: «Линейный алгоритм поиска»

textual
Листинг программы
  1. public void SymmetricExceptWith(IEnumerable<T> other)
  2.     {
  3.       if (other == null)
  4.         throw new ArgumentNullException("other");
  5.       if (this.m_count == 0)
  6.         this.UnionWith(other);
  7.       else if (other == this)
  8.       {
  9.         this.Clear();
  10.       }
  11.       else
  12.       {
  13.         HashSet<T> hashSet = other as HashSet<T>;
  14.         if (hashSet != null && HashSet<T>.AreEqualityComparersEqual(this, hashSet))
  15.           this.SymmetricExceptWithUniqueHashSet(hashSet);
  16.         else
  17.           this.SymmetricExceptWithEnumerable(other);
  18.       }
  19.     }
  20.  
  21.     private void SymmetricExceptWithUniqueHashSet(HashSet<T> other)
  22.     {
  23.       foreach (T obj in other)
  24.       {
  25.         if (!this.Remove(obj))
  26.           this.AddIfNotPresent(obj);
  27.       }
  28.     }
  29.  
  30.     [SecuritySafeCritical]
  31.     private unsafe void SymmetricExceptWithEnumerable(IEnumerable<T> other)
  32.     {
  33.       int n = this.m_lastIndex;
  34.       int length = BitHelper.ToIntArrayLength(n);
  35.       BitHelper bitHelper1;
  36.       BitHelper bitHelper2;
  37.       if (length <= 50)
  38.       {
  39.         int* bitArrayPtr1 = stackalloc int[length];
  40.         bitHelper1 = new BitHelper(bitArrayPtr1, length);
  41.         int* bitArrayPtr2 = stackalloc int[length];
  42.         bitHelper2 = new BitHelper(bitArrayPtr2, length);
  43.       }
  44.       else
  45.       {
  46.         bitHelper1 = new BitHelper(new int[length], length);
  47.         bitHelper2 = new BitHelper(new int[length], length);
  48.       }
  49.       foreach (T obj in other)
  50.       {
  51.         int location = 0;
  52.         if (this.AddOrGetLocation(obj, out location))
  53.           bitHelper2.MarkBit(location);
  54.         else if (location < n && !bitHelper2.IsMarked(location))
  55.           bitHelper1.MarkBit(location);
  56.       }
  57.       for (int bitPosition = 0; bitPosition < n; ++bitPosition)
  58.       {
  59.         if (bitHelper1.IsMarked(bitPosition))
  60.           this.Remove(this.m_slots[bitPosition].value);
  61.       }
  62.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы