Где я должен посмотреть, хочу ли я написать фрагмент кода, который ищет Array1 в Array2, независимо от порядка (учитывая дубликаты)? например
Array1: { 2,5,6,6,3 }
Array2: { 1,2,3,4,5,6,6 }
will return true
Array1: { 2,5,6,6,3 }
Array2: { 1,2,3,4,5,6 }
will return false
Я вроде хочу решить его myslef, мне просто нужно указать в каком-то направлении.
Заранее спасибо.
Ну, поскольку вам нужны только подсказки, а не код, один из методов:
Скопируйте array2
в List<int>
.
Выделите бит массива, который used
равным размеру списка. Это будут флажки, указывающие, был ли конкретный элемент в отсортированном списке использован для соответствия.
Для каждого элемента item
в array1
:
4.1 Двоичный поиск отсортированного списка для item
.
4.2. Если не найдено, return false - array2
не содержит array1
.
4,3. Если найдено, и есть дубликаты, алгоритм двоичного поиска будет случайным образом возвращать индекс одного из дубликатов. Отсканируйте назад в части списка, которая соответствует item
пока не найдете тот, для которого used[i]
, значение false. Если вы его найдете, установите used[i]
значение true и продолжите внешний цикл. Если вы его не нашли, отсканируйте его в исходном двоичном индексе поиска, пытаясь найти неиспользуемое совпадение. Аналогичным образом used[index]
для true, если оно найдено, и продолжить цикл через array1
.
4.4 Если не найдено неиспользуемого совпадения, верните false - array2
не содержит array1
.
Найдя неиспользуемое соответствие для каждого элемента array1
, верните true: array1
содержится внутри array2
.
Преимущество этого алгоритма состоит в том, что для проверки множества массивов для содержания в данном массиве вам не нужно повторно сортировать массив каждый раз, вам нужно только повторно назначить BitArray
.