Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
RAD 2009-XE2

Как найти строки, сохраняя их порядок?

12.10.2022, 04:42. Показов 3787. Ответов 70
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, возник вопрос как сохранить порядок всех слов найденных в строке если например ищу через pos по файлу, а в файле само собой слова не по порядку идут ?
Просто я использую массив для этого он сохраняет много пустых строк от начала и с конца =(

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
procedure FSearch(str: string; const iBufferSize: Integer);
var
  fs: TBufferedFileStream;
  sr: TStreamReader;
  line:string;
  p:integer;
  ar:array of string;
begin
  fs := TBufferedFileStream.Create(extractfilepath(paramstr(0))+'wordlist.txt', fmShareDenyNone, iBufferSize);
  try
    sr := TStreamReader.Create(fs,TEncoding.ANSI, False, 256);
    try
      repeat
       line:=sr.ReadLine;
        p:=Pos(line,str);
        if p>0 then begin
        SetLength(ar,p+1);
        ar[p]:=line;
        end;
       until sr.EndOfStream;
    finally
      sr.Free
    end;
  finally
    fs.Free;
  end;
for p:=Low(ar) to High(ar) do
form1.memo1.lines.add(ar[p]);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
FSearch('найди следующие слова: ежик туман медведь луна талант',1024);
end;
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2022, 04:42
Ответы с готовыми решениями:

Переместить все цифры в конец, а остальные символы в начало строки, сохраняя порядок взаимного расположения
Преобразовать строку символов по пaравилу: переместить все цифры в конец, а остальные символы в начало строки, сохраняя порядок взаимного...

Прямоугольную матрицу привести к квадратной путем удаления наим эл-тов каждой строки, сохраняя порядок
Сформировать в динамической памяти целочисленную матрицу размером N*M (N<M вводятся с клавиатуры). Получить квадратную матрицу порядка...

Как поменять местами две половины массива, сохраняя их порядок?
Как поменять местами две половины массива, сохраняя их порядок? Выгляеть должно так: исходный массив 123456 обработанный массив ...

70
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
19.10.2022, 01:09
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Uefi220 Посмотреть сообщение
Я нашёл QuickSort но он отказывается правильно работать:
Я публиковал темку про сортировки, там много вариантов, выбирайте какой понравится.
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
19.10.2022, 03:59  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
Я публиковал темку про сортировки, там много вариантов, выбирайте какой понравится.
Да но там половина кода не компилируется а разбираться из за чего не хочется вовсе =)

Добавлено через 2 часа 0 минут
Наконец то сработало всем огромное спасибо за помощь кто помогал=)

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
procedure FMYSearch(str: string; const iBufferSize: Integer);
type
  WordsFound = record
    findPos: Integer; // позиция в строке StrNeedle
    findText: string; // текст из словаря
end;
var
  fs: TBufferedFileStream;
  sr: TStreamReader;
  p,len:integer;
  line:string;
  ar:array of WordsFound;
  n,i,j:byte;
  x:WordsFound;
begin
  fs := TBufferedFileStream.Create(extractfilepath(paramstr(0))+'wordlist.txt', fmShareDenyNone, iBufferSize);
  try
    sr := TStreamReader.Create(fs,TEncoding.ANSI, False, 256);
    try
      repeat
        line:=sr.ReadLine;
        p:=Pos(line,str);
        if p>0 then begin
        len := Length(ar);
        SetLength(ar,len+1);
        ar[len].findPos := p;
        ar[len].findText:=line;
        for p:=p to p+Length(line)-1 do str[p] := ' ';
        sr.DiscardBufferedData;
        sr.BaseStream.Position:=0;
        end;
       until sr.EndOfStream;
    finally
      sr.Free
    end;
  finally
    fs.Free;
  end;
n:=High(ar);
for i:=0 to n do
for j:=i+1 to n do
 if ar[i].findPos>ar[j].findPos then
   begin
    x:=ar[i];
    ar[i]:=ar[j];
    ar[j]:=x;
   end;
for p:=Low(ar) to High(ar) do
form1.memo1.lines.add(ar[p].findText);
end;
0
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
19.10.2022, 10:07
Цитата Сообщение от Uefi220 Посмотреть сообщение
Наконец то сработало
Отлично! Поздравляю!

в 40 строке желательно сделать цикл до n-1 (так правильно и красивее)
Delphi
1
for i:=0 to n-1 do
QuickSort тут можно легко прикрутить, но тут ничего не даст - это как из пушки по воробьям стрелять.

Лучше сортировать не массив ar, а его индексы. Теоретически это может дать малюсенький выигрыш.
Впрочем, если в коде присутствует вывод в мемо, то по сравнению в выводом в визуальный компонент и его отображением все эти выигрыши в несколько миллисекунд никому не нужны и ничего на дадут.


ну и ещё, вдогонку..
уж извини, но небольшая ложечка дёгтя...

Только я вчера увидел ещё один косяк в твоём алгоритме поиска слов.
В связи с тем, что ты ищешь вхождение словарных слов в свою строку, ты легко можешь получить ложные срабатывания поиска - когда поиском найдётся словарное слово, входящее как часть другого слова в строке.
пример.
пусть есть такой словарь слов wordlist.txt
Code
1
2
3
4
5
луна
медведь
туман
талант
ежик
а ты хочешь найти слова в такой строке:
найди следующие слова: лунатик пежиковый абастумани безталантный

Уже догадываешься, что при этом произойдёт?
1
57 / 52 / 5
Регистрация: 18.11.2018
Сообщений: 295
19.10.2022, 10:12
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
Уже догадываешься, что при этом произойдёт?
А если пробелами отделять слова в списке ?
Тогда вхождение в более длинное слово будет исключено вроде...
2
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
19.10.2022, 10:15
решить эту проблему можно, нужно изменить алгоритм поиска. Либо совсем его переделать, либо, если ты этого не хочешь, можешь добавить разделители слов.
У тебя же только пробелы допускаются в строке поиска?
Тогда добавь пробелы при поиске слов.
только не забудь и в строку, где ты ищешь слова добавить пробелы в начале и конце строки:

Delphi
1
2
3
4
begin
   str := ' '+str+' ';
...
   p:=Pos(' '+line+' ',str);
Добавлено через 1 минуту
Цитата Сообщение от Иван Ежик Посмотреть сообщение
А если пробелами отделять слова в списке ?
угу. точно так. но это сработает только если в строке поиска используются пробелы для разделения слов.
строчка луна,ежик,туман уже не будет работать.

Но, похоже, что у Uefi220 как раз только пробелы и используются.
2
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
19.10.2022, 10:17  [ТС]
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
а ты хочешь найти слова в такой строке:
найди следующие слова: лунатик пежиковый абастумани безталантный
Я это предусмотрел и сам словарь отсортировал от больших слов сначала к меньшим то есть большие слова вначале маленькие в конце =)

Добавлено через 1 минуту
Цитата Сообщение от Иван Ежик Посмотреть сообщение
Тогда вхождение
Список может быть в несколько строк по одному слову к сожалению (
0
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
19.10.2022, 10:18
Цитата Сообщение от Uefi220 Посмотреть сообщение
Я это предусмотрел и сам словарь отсортировал от больших слов сначала к меньшим то есть большие слова вначале маленькие в конце =)
интересный подход
ну, тогда ладно, можно на проблему возможных коллизий не обращать внимания..
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
19.10.2022, 10:24  [ТС]
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
ну, тогда ладно, можно на проблему возможных коллизий не обращать внимания..
Единственное с чем я щас столкнулся это то что потоки не по порядку идут вот здесь проблема если слова разбросаны по одному в строке
0
14 / 11 / 3
Регистрация: 14.08.2022
Сообщений: 157
22.10.2022, 00:44
я так и не понял в чем собственно проблема.
что мешает читать каждое слово в буфер а потом сравнивать его с списком?
да, скорость падает с увеличением списка, но не до такой степени, как кажется на первый взгляд.
А если въехать в алгоритм Мура то все будет намного быстрее.

Не ясно только что с этими словами делать?
Подсчитать их количество или найти все вхождения в тексте?
Или еще определить строку, в смысле абзац, где оно находится.
0
57 / 52 / 5
Регистрация: 18.11.2018
Сообщений: 295
22.10.2022, 10:32
Цитата Сообщение от leors Посмотреть сообщение
алгоритм Мура
Судя по задаче со словарём, тут предпочтительнее будет Ахо-Корасик.
Но с С++ я не переведу...
https://pastebin.com/cRqnPZyC
0
14 / 11 / 3
Регистрация: 14.08.2022
Сообщений: 157
22.10.2022, 13:30
Цитата Сообщение от Иван Ежик Посмотреть сообщение
Судя по задаче со словарём, тут предпочтительнее будет Ахо-Корасик.
Я сказал не применить алгоритм Мура. А въехать в его принцип.
А принцип крайне прост. Все что нужно и словарь и слова превратить в числа и все.
Есть такое волшебное слово хеш-сумма.
Вначале вычисляется хеш словаря.
Потом основной цикл читает строку по буквам и по достижении конца слова (не буква) выдает хеш полученной буквенной последовательности. И тут вспомогательный цикл сравнивает этот хеш, с хешами словаря. На этом принципе построены многие поисковые системы, в том числе и система идентификации по паролю.
Алгоритм Ахо-Корасик вообще тихий ужас. Заводить кучу буферов, проталкивать в них данные. вычислять заполнение. потом восстанавливать все...
0
57 / 52 / 5
Регистрация: 18.11.2018
Сообщений: 295
22.10.2022, 14:06
Цитата Сообщение от leors Посмотреть сообщение
вообще тихий ужас
Я не читал дальше вики...
А вообще есть интересное чтиво со сравнением
"The Exact String Matching Problem:
a Comprehensive Experimental Evaluation"
https://arxiv.org/pdf/1012.2547v1.pdf
Но там нет алгоритмов новее 2010 в сравнении.

Добавлено через 12 минут
https://www.rsdn.org/article/alg/textsearch.xml
А вот и бойер мур на паскале
0
14 / 11 / 3
Регистрация: 14.08.2022
Сообщений: 157
22.10.2022, 14:54
Цитата Сообщение от Иван Ежик Посмотреть сообщение
А вот и бойер мур на паскале
Чот явно не то.

таблицы какие-то смещения....
Когда я делал свой алгоритм я не слышал ни про мура ни про прочих.
А потом где-то попался поиск на хеш-сумме, но мне почему-то въелся этот мур.
Мой алгоритм это интеграл хеш функции.
То есть по сути каждый текущий корректный символ является аргументом хеш-функции на каждом шаге.
И по мере сложения результатов получаем общую сумму.
Тут дело лишь в том, что хеш-функция должна быть простой, быстрой и не допускать коллизий.
у меня пока проблем с этим нет. Все работает четко.
хеш вычисляется на int64 и ограничение на длину текста с учетом юникода 16 2 гига (поскольку в паскаль нет такого числа без знака.)
кроме того есть и ухищрения в виде таблицы, которая, хотя и занимает в базовом варианте 128К а в расширенном 256К (для UTF-16) но зато существенно влияет на скорость чтения символов.
0
57 / 52 / 5
Регистрация: 18.11.2018
Сообщений: 295
22.10.2022, 18:28
Цитата Сообщение от leors Посмотреть сообщение
интеграл хеш функции.
Звучит странно.
Хеш (в идеале) даст только одно совпадение без коллизий.
А интеграл по своему смыслу приближённое вычисление (ибо компуктер не умеет в бесконечную точность).
И символы слов конечны(для каждого алфавита), их не возможно интегрировать...
Получается вы считали хеш от алфавита накапливая его сумму для слов? Если так то терялся порядок букв.
А чтобы его не потерять нужно учитывать положение символа при вычислении хеша...
Цитата Сообщение от leors Посмотреть сообщение
хеш вычисляется на int64 и ограничение на длину текста с учетом юникода 16 2 гига
И что получается вы считали хеш для каждого из 1073741824 символов в двухгигабайтном тексте? тогда теряется привязка к началу "слова"...
Будет время почитаю на досуге глубже.
Мне кажется это очень вычислительно неоптимально...
0
14 / 11 / 3
Регистрация: 14.08.2022
Сообщений: 157
22.10.2022, 20:23
Цитата Сообщение от Иван Ежик Посмотреть сообщение
Хеш (в идеале) даст только одно совпадение без коллизий.
А вы не в курсе что такое, например, контрольная сумма файлов?

Что касается привязки. О какой именно привязке.
Вы знаете начало слова вот вам и привязка.
дошли до другого слова, опять привязываете.
У меня модуль давно написан. я им пользуюсь. а для вас странно.
Что такое интеграл вы вообще не в курсе.
при чем тут вообще буквы? Поиск идет не по буквам а по бинарным данным. то есть по текущему коду.
Я могу читать строку через ord() или поток через числовую переменную.
без разницы.
эти числа играют роль аргумента. они вычисляются по формуле на каждой итерации.
когда достигнут конец слова имеем уникальное число. это и есть хеш.
0
22.10.2022, 21:08

Не по теме:

Цитата Сообщение от leors Посмотреть сообщение
контрольная сумма файлов
вкурсе.
Цитата Сообщение от leors Посмотреть сообщение
У меня модуль давно написан. я им пользуюсь. а для вас странно.
Просто я не стал бы называть интегралом основное действие алгоритма.

Цитата Сообщение от leors Посмотреть сообщение
Что такое интеграл вы вообще не в курсе.
Ну да, и про производные не слышал. и площадь графика ф-ции на втором курсе не вычислял, как раз таки через интеграл.
Только было это уже лет 19 назад. и поскольку я не математик то позабыл уже.
Цитата Сообщение от leors Посмотреть сообщение
это и есть хеш.
А вы тестировали производительность? Некоторые версии компилятора делфи(старые) хранят int64 в двух 32 бит регистрах

0
14 / 11 / 3
Регистрация: 14.08.2022
Сообщений: 157
22.10.2022, 21:43
Цитата Сообщение от Иван Ежик Посмотреть сообщение
Ну да, и про производные не слышал. и площадь графика ф-ции на втором курсе не вычислял,
Обалдеть. Это программа 9-10 классов средней школы.

Что касается скорости, разницы не заметил.
пробовал и с DWord и int64
и вообще, у меня 7-ка. а 8 байтовый int введен с 5 версии.
0
57 / 52 / 5
Регистрация: 18.11.2018
Сообщений: 295
22.10.2022, 21:48
Цитата Сообщение от leors Посмотреть сообщение
9-10 классов
А у меня их не было )
Цитата Сообщение от leors Посмотреть сообщение
Что касается скорости
Ну так какая скорость?пусть это и неправильно поскольку есть зависимость от входных данных...
На среднем тексте, в байтах/сек или Мб/сек ?

читал недавно от яндекса статью по теме у них индексированная база архивированных хешей 500-800 Мб скорость на 1 поток.
Миниатюры
Как найти строки, сохраняя их порядок?  
0
57 / 52 / 5
Регистрация: 18.11.2018
Сообщений: 295
22.10.2022, 21:49
Цитата Сообщение от leors Посмотреть сообщение
8 байтовый int введен с 5 версии.
Но регистры во встроенном ассемблере 32 битные. в семёрке точно.
* не mmx
0
22.10.2022, 21:59

Не по теме:

Предлагаю растянуть эту тему еще как минимум на десять страниц, вывести в топ по количеству просмотров. Затем присвоить этой теме почетный знак "Почетный полный <Пи-зЦ>"; затем каждой подобной теме, присваивать таким темам оценки от белочки и северного пушистого зверька до полного, и лютого... :)
и да ТС, награждать званием "Почетный ..."

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.10.2022, 21:59

В массиве, все элементы которого различны, найти и удалить n наименьших элементов, «поджимая» массив к началу и сохраняя порядок следования C/C++
В массиве А(l), все элементы которого различны, найти и удалить n наименьших элементов, «поджимая» массив к началу и сохраняя порядок...

В массиве, все элементы которого различны, найти и удалить n наименьших элементов, «поджимая» массив к началу и сохраняя порядок следования
В массиве, все элементы которого различны, найти и удалить n наименьших элементов, «поджимая» массив к началу и сохраняя порядок следования

В массиве, все элементы которого различны, найти и удалить n наименьших элементов, «поджимая» массив к началу и сохраняя порядок следования
В массиве А(l), все элементы которого различны, найти и удалить n наименьших элементов, «поджимая» массив к началу и сохраняя порядок...

Как переставить первые два и последние два элемента местами в массиве, сохраняя порядок их следования?
подскажите как переставить первые два и последние два элемента местами в массиве, сохраняя порядок их следования.

Bывести числа от A до B, сохраняя заданный порядок
Bывести на экран числа от A до B, сохраняя заданный порядок. Формат входных данных Вводятся два числа А и В (|А|, |В| &lt; 231 - 1). ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru