Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2010, 13:39   #11
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

4 гига байта ты в память не как не поднимеш, то и есть в массив.
VintProg вне форума Ответить с цитированием
Старый 30.06.2010, 13:44   #12
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от VintProg Посмотреть сообщение
4 гига байта ты в память не как не поднимеш, то и есть в массив.
Это понятно, что не подниму, но теоретически длинные строки ограничены этим размером. А фактически сколько операционка даст. То есть вполне возможна ситуация когда один элемент пустая строка, а второй строка в пару сотен килобайт.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 30.06.2010, 13:47   #13
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Вообще можно сравнивать по блочно, загрузил кусок файла строк, проверил и выгрузил, и загрузил следующий кусок файла проверил, и так далее...
VintProg вне форума Ответить с цитированием
Старый 30.06.2010, 13:48   #14
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

"Потяну\Непотяну" - это проблемы пользователей, которые себе по 18 гигов оперативы ставят.

Как осуществляется добавление в массив? Может на этой стадии идти блоками памяти, проверяя их одинаковость?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 30.06.2010, 13:53   #15
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Цитата:
Как осуществляется добавление в массив? Может на этой стадии идти блоками памяти, проверяя их одинаковость?
Именно оптимальный вариант.
VintProg вне форума Ответить с цитированием
Старый 30.06.2010, 14:06   #16
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Alex Cones Посмотреть сообщение
Как осуществляется добавление в массив? Может на этой стадии идти блоками памяти, проверяя их одинаковость?
Ну есть общий метод класса - добавление элемента в структуру. Если элемент строка (это определяется просто overload функциями), то он передается в нашу функцию. Она-то и должна добавлять в массив данную строку, а вместо нее возвращать индекс. Все дальнейшие манипуляции осуществляются с индексом (как-то копирование мегабайтных строк). Если строка уже существует, то передается ее индекс, а увеличение массива происходить не должно. Удаление аналогично. Есть одна структура, которая отслеживает число ссылок (сколько раз брали индекс массива). Если число ссылок меньше единицы строка выкидывается из массива. Все это не сложно и реализуемо. Вопрос в скорости при добавлении и поиска новой строки в массиве.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 30.06.2010, 14:26   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а чем мой способ то не подошел?
сравнение блоков это прогон по памяти практически всей...
Код:
function phLCompareMem(Dest,Source:pointer;Count:integer):boolean;{register; думаю лучше добавлять}
asm
 push esi
 push edi
 mov esi,edx
 mov edi,eax
 xor eax,eax
 repe cmpsb
 jne @PEnd
 mov eax,1
@PEnd:
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.06.2010, 14:38   #18
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Да, собственно чем это отличается от if String1=String2 then? И это предполагает знание длинны. То есть сначала надо сравнивать по длинам (об этом я тоже думал, наряду с первым символом).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 30.06.2010, 14:50   #19
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

так у нас строки это стандартный string?

ну я думаю длина нам все равно нужна
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.06.2010, 14:54   #20
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
так у нас строки это стандартный string?

ну я думаю длина нам все равно нужна
У нас длинные строки, до 4-х гигабайт . Ваш вариант я понял - мерить сначала длины (для длинных строк это приемлимо).

ДОБАВЛЕНО:
Вот наваял, если кому интересно:
Код:
// Внесение строки в пул строк
// Возвращает индекс строки в хранилище
function TVectors.AddString (Value: String): Integer;
var
      L: Integer;
  I: Integer;
begin

      // Инициализация
      result:=-1;   // Строка не добавлена

      // Получим число символов в строке
      L:=Length(Value);

      // В массиве есть строки?
      if Length(Strings)>0 then
      begin

            // Сравниваем по длинам
            for I := 0 to Length(Strings)-1 do
            begin

                  // Длина строки
                  if Length(Strings[i].Value)=L then
                  begin

                        // Сравним строки
                        if Strings[i].Value=Value then
                        begin

                              // Увеличиваем число ссылок на данную строку
                              Inc(Strings[i].Link);

                              // Вернем индекс
                              result:=i;

                              // Работа закончена
                              Exit;
                        end;
                  end;
            end;
      end;

      // Строка не найдена? Тогда добавим в массив :)
      L:=Length(Strings);
      Inc(L);

      // Выделяем место под строку
      SetLength(Strings, L);

      // Инициализируем
      Strings[L-1].Link:=1;
      Strings[L-1].Value:=Value;
    
      // Передадим индекс
      result:=L-1;
end;
////////////////////////////////////////////////////////////////////////////////
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 30.06.2010 в 15:45.
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение строк Jasper92 Общие вопросы C/C++ 6 23.12.2009 12:49
сравнение строк -? Evgenii Общие вопросы Delphi 10 15.07.2009 15:28
С++. Сравнение строк maxlav Помощь студентам 8 25.06.2009 04:33
Сравнение строк Elm0 Паскаль, Turbo Pascal, PascalABC.NET 2 02.06.2008 09:31
Сравнение строк HOMER Общие вопросы Delphi 7 04.01.2008 05:53