Показать сообщение отдельно
Старый 19.08.2014, 19:02   #2
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 27.06.2009
Адрес: Рязань-Москва
Сообщений: 471
Написано 401 полезных сообщений
(для 1,072 пользователей)
Ответ: Поиск повторений

Напишу на пурике - но общий алгоритм думаю понятен. Фиг знает как с производительностью...
Наверно нужно ограничение на длину семпла...

data.s=... ;Исходные данные
max_sample.i=10 ;Ограничение на длину семпла
Structure sample
  List Pos.i()
EndStructure
NewMap Samples.Sample()

;Перебираем все символы - позиция "курсора"
For pos=1 To Len(data)

  ;Перебираем семплы разной длины от данной позиции
  For sample_len=1 to max_sample
    cur_sample.s=Mid(data,pos,sample_len)

    ;Ищем данный семпл в сохраненных
    If FindMapElement(Samples(),cur_sample)=0

      ;Если нет, добавляем
      AddMapElement(Samples(),cur_sample)

      ;Ищем данный семпл в оставшейся части данных, запоминаем позиции
      find_pos=FindString(data,cur_sample,pos)

      Repeat
        AddElement(Samples()\Pos())
        Samples()\Pos()=find_pos
        find_pos=find_pos+Len(cur_sample)
        find_pos=FindString(data,cur_sample,find_pos)
      Until find_pos>0

    EndIf

  Next

Next
В итоге получим кучу записей Samples() со списком позиций в каждой.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
RegIon (20.08.2014)