|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.10.2013, 16:55 | #11 |
Форумчанин
Регистрация: 15.06.2010
Сообщений: 740
|
Тут вот какое дело: провел чисто эксперимент с ассемблером и прочим дебагом
Первый файл - 28 Mb строк: 2472037 Второй файл - 18 Kb строк: 1989 Соответственно ищем строки второго файла в первом. Даже если не делать никаких сравнений, кроме как по размеру, то для каждой проверяемой строки нужно пробежаться по циклу 2472037 раз; для 1989 строк количество итераций 1989*2472037 = 4916881593 . На моем не самом хилом компе это происходит за ~15 секунд, что в целом - дофига. Код:
Итого, с этой пустой болванкой, я не смог дождаться окончания выполнения работы при размере второго файла в 18Mb (1496076 строк). Это 1496076*2472037 = 3698355226812 итераций. Таким образом либо сортировка, либо построение индекса, что бы знать какие строки с какой длинной находятся на какой позиции относительно начала массива.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
|
06.10.2013, 17:47 | #12 |
Форумчанин
Регистрация: 15.06.2010
Сообщений: 740
|
Как создать динамический массив строк?
Делаю: Код:
Код:
UPD: TstringList - абсолютно такая же фигня. Runtime error: Out of Memory. Гавно какоето.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Последний раз редактировалось Tronix; 06.10.2013 в 18:29. |
06.10.2013, 18:32 | #13 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Ну Вам же не обязательно сравнивать всю строку сразу. Допустим брать 3 первых символа от строки и сравнить. Сравнение 3-х символов обходится быстрей чем 50 к примеру (а строки длинные?). Уже если прошло совпадение первых 3-х символов, то сравнивать по полной.
Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика Последний раз редактировалось Utkin; 06.10.2013 в 18:35. |
|
06.10.2013, 20:20 | #14 | |
Форумчанин
Регистрация: 15.06.2010
Сообщений: 740
|
Цитата:
Короче не могу я придумать как нормально организовать динамический массив строк, чтоб используемая память при этом не превышала в разы исходный размер файла. Походу в паскале с этим серьезные проблемы Щаз храню просто в массиве байт. Первый символ - размер, затем строка и тд. Но я не могу нормально посортировать такой массив, так как я могу обменивать только соседние ячейки, а произвольные не могу. Вернее могу, но тогда придется двигать много данных в памяти. А соседние ячейки - это пузырек, но он адски медленный. Ваще короче делаю вывод, что походу задача на языке паскаль/дельфе не решается. Си рулит.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
|
|
06.10.2013, 20:24 | #15 | |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,872
|
Цитата:
|
|
06.10.2013, 20:26 | #16 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
var MyArray: array of String; -- SetLength(MyArray,100); // память под 100 в любой момент можно добавить не затерев данные, лучше и сильно быстрей сразу всю память под массив
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
06.10.2013, 20:44 | #17 |
Форумчанин
Регистрация: 15.06.2010
Сообщений: 740
|
Кода нет, есть только екзешник и известно что афтор использовал стандартный stdl:qsort
На исходник я бы сам с удовольствием взглянул. Подозреваю что там используются векторы Беда в том, что он мне для одной строки выделит 255 или если ansistring 65535 байт. А может у меня строка всего из 4-ех символов?
Чтобы понять рекурсию, сперва нужно понять рекурсию.
|
06.10.2013, 20:52 | #18 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
ADD Я вообще-то про дельфи, с Free паскалем не в теме
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 06.10.2013 в 20:57. |
|
06.10.2013, 20:53 | #19 | |
Форумчанин
Регистрация: 15.06.2010
Сообщений: 740
|
Цитата:
UPD: Да, хорошее решение. Только нужно заранее знать кол-во строк ((( То есть файл придется читать два раза. UPD2: Нет, для 28 Mb файла памяти отжирается ~600 метров. Увы (((
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Последний раз редактировалось Tronix; 06.10.2013 в 21:16. |
|
06.10.2013, 21:37 | #20 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
А среда какая? В дельфи такого не может быть. Накладные расходы есть конечно - указатель на строку, длина строки, но не до такой степени
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Удалить дубликаты из разных книг (листов) | mojo | Microsoft Office Excel | 2 | 04.08.2012 13:28 |
удалить много строк из listbox delphi | SonicBob | Помощь студентам | 3 | 19.09.2011 10:46 |
удалить дубликаты в stringlist | yuran111 | Общие вопросы Delphi | 3 | 29.04.2011 18:24 |
Удалить повторы строк | Federal | Помощь студентам | 16 | 27.02.2011 02:37 |
Как в удалить кучу строк, через одну? | levohotnik | Microsoft Office Excel | 6 | 09.09.2010 21:08 |