Russian Qt Forum
Апрель 20, 2024, 03:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Поиск изменений между массивами  (Прочитано 7034 раз)
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« : Ноябрь 04, 2016, 22:24 »

Может, конечно, это я туплю, но такая вроде бы простая задача "не гуглится".
В общем - есть 2 массива, второй является производным от первого, но в несколько изменённом состоянии (где-то что-то удалили, где-то добавили, где-то заменили и пр.) Задача - найти "где" и "что".
Решение "в лоб", в принципе, я сделал, но не верю, что нет ничего стандартного...
« Последнее редактирование: Ноябрь 06, 2016, 15:08 от Racheengel » Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Ноябрь 05, 2016, 12:52 »

Неск лет назад это делал, спрашивал здесь же (рез-т тот же). Очень близко к "сравнению исходников". Долго разрывать, что (смутно) помню: сначала оба массива поделить на "блоки", псевдокод
Код
C++ (Qt)
struct Block {
int beg, end;  // первый и последний эл-ты
int match;   // индекс блока с тем же содержимым для 2-го массива (или -1 если такого нет)
};
 
После этого все сразу "ложится"
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #2 : Ноябрь 05, 2016, 14:01 »

Решение "в лоб", в принципе, я сделал, но не верю, что нет ничего стандартного...
Ну прямо стандартного конечно нет, но если речь про бинарный diff, то библиотек есть не мало.
Например, вот: https://github.com/cubicdaiya/dtl
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Ноябрь 06, 2016, 04:24 »

Пусть есть массивы/контейнеры A и B и текущие позиции i для A и j для B. Тогда

- если A[ i ] == B[ j ] то наращиваем совпадающий блок до упора

- иначе ищем первое совпадение в противоположном массиве (в B для A[ i ] и в А для B[ j ]). Напр оказалось A[ i ] == B[ j + 5 ]. Это значит мы нашли решение при котором не совпало 5 эл-тов. Пытаемся улучшить его повторив поиск для A[ i + 1 ]....A[ i + 4 ]. Напр если A[ i + 1 ] == B[ j ], то всего 1 эл-т не совпал. Ну дальше "дело техники" оформить это рекурсией
Записан
rudireg
Гость
« Ответ #4 : Ноябрь 06, 2016, 10:38 »

Может так?
Код
C++ (Qt)
A[100]; //исходные данные
B[100];
 
for(int i=0; i<100; ++i){
   if( A[i] != B[i] )
      //Нет совпадения
}
 
« Последнее редактирование: Ноябрь 06, 2016, 10:40 от rudireg » Записан
Bepec
Гость
« Ответ #5 : Ноябрь 06, 2016, 11:45 »

Если взять все возможные варианты, количество ошибок при этом может возрасти многократно. Достаточно добавить три четыре повторяющихся последовательности перед уже имеющейся и получает что первая будет принята за истинную, оставшиеся за добавленные. Ну и тому подобное.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Ноябрь 06, 2016, 15:07 »

Да, в принципе я примерно так и сделал - искал сначала совпадающий блок, потом параллельно просматривал оба массива до первого "значительного" совпадения (т.е. как минимум более 1 символа, это настраивается), потом генерировал элемент для SES и тд.

В общем, всем спасибо) Igors, Old: посмотрю еще "бинарный diff", возможно, он будет более шустрым, чем моё велосипедо.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
joker
Новичок

Offline Offline

Сообщений: 49


Просмотр профиля
« Ответ #7 : Ноябрь 21, 2016, 10:50 »

Я извиняюсь, что влажу, но постановка задачи очень сильно напомнила вот такую штуку
Может быть поможет.

https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D1%81%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_%D0%9B%D0%B5%D0%B2%D0%B5%D0%BD%D1%88%D1%82%D0%B5%D0%B9%D0%BD%D0%B0
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.13 секунд. Запросов: 22.