Линейный алгоритм поиска - C#
Формулировка задачи:
Доброго времени суток.
И так, нужно найти элементы которые присутствуют только в массиве Но для выше поставленной задачи этот вариант не подходит, та как если просто написать
произойдет множественное дублирование.
Есть конечно идея сравнивать каждый элемент a[i] со всеми элементами b[j], и уже после этого делать вывод по параметру
То бишь если нет ни одного схожего элемента, значит он уникальный и записываем в массив
a
или только в массивеb
, то бишь исключить повторяющиеся элементы (массивы одномерные). Когда нужно было найти элементы присутствующие в обоих массивах использовался вот такой алгоритмint[] c = new int[n + m]; int count = 0; for (i = 0; i < a.Length; i++) { for (j = 0; j < b.Length; j++) { if (a[i] == b[j]) { c[count] = a[i]; count++; } } }
if (a[i] != b[j])
if (a[i] == b[j])
c
. Но вот никак не получается это реализовать. Прошу помощи в данном вопросе.Решение задачи: «Линейный алгоритм поиска»
textual
Листинг программы
public void SymmetricExceptWith(IEnumerable<T> other) { if (other == null) throw new ArgumentNullException("other"); if (this.m_count == 0) this.UnionWith(other); else if (other == this) { this.Clear(); } else { HashSet<T> hashSet = other as HashSet<T>; if (hashSet != null && HashSet<T>.AreEqualityComparersEqual(this, hashSet)) this.SymmetricExceptWithUniqueHashSet(hashSet); else this.SymmetricExceptWithEnumerable(other); } } private void SymmetricExceptWithUniqueHashSet(HashSet<T> other) { foreach (T obj in other) { if (!this.Remove(obj)) this.AddIfNotPresent(obj); } } [SecuritySafeCritical] private unsafe void SymmetricExceptWithEnumerable(IEnumerable<T> other) { int n = this.m_lastIndex; int length = BitHelper.ToIntArrayLength(n); BitHelper bitHelper1; BitHelper bitHelper2; if (length <= 50) { int* bitArrayPtr1 = stackalloc int[length]; bitHelper1 = new BitHelper(bitArrayPtr1, length); int* bitArrayPtr2 = stackalloc int[length]; bitHelper2 = new BitHelper(bitArrayPtr2, length); } else { bitHelper1 = new BitHelper(new int[length], length); bitHelper2 = new BitHelper(new int[length], length); } foreach (T obj in other) { int location = 0; if (this.AddOrGetLocation(obj, out location)) bitHelper2.MarkBit(location); else if (location < n && !bitHelper2.IsMarked(location)) bitHelper1.MarkBit(location); } for (int bitPosition = 0; bitPosition < n; ++bitPosition) { if (bitHelper1.IsMarked(bitPosition)) this.Remove(this.m_slots[bitPosition].value); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д