Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> sizeof(std::string) == 32, Почему ??? 
V
    Опции темы
Mayk
Дата 1.8.2008, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Любитель @  31.7.2008,  17:53 Найти цитируемый пост)

Резервируется, короче, она никак не внутри класса. Ибо размер класса статичен, строки - нет

Если размер строки <константы то его не статичность идёт побоку. Ссылка  на Short String Optimisation уже была.


Это сообщение отредактировал(а) Mayk - 1.8.2008, 05:36


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
andrew_121
Дата 1.8.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(UnrealMan @  1.8.2008,  02:18 Найти цитируемый пост)
Сделано специально для малых строк. Таким образом малые строки могут храниться в стеке, что может повысить быстродействие. Если длина строки больше некоторого порогового значения, то для хранения символов используется динамическая память.

Глупость smile  А если длина строки меньше 12, то что, где рассудок? smile  smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Lazin
Дата 1.8.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(andrew_121 @  1.8.2008,  12:01 Найти цитируемый пост)
Глупость smile  А если длина строки меньше 12, то что, где рассудок?

ты учти что менеджер памяти выделяет память под маленькие объекты блоками фиксированного размера, кратными степеням двойки, под строку размером 12 байт может быть выделено 16 байт, а может и 32... плюс обращение к строке в куче дороже чем обращение к строке в стеке, плюс создание и освобождение строки в куче не дешевая операция, в отличии от создания объекта в стеке...

блин, так и не понял, нафига тебе хранить кучу строк в памяти?
PM MAIL Skype GTalk   Вверх
Vyacheslav
Дата 1.8.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(Любитель @  31.7.2008,  13:35 Найти цитируемый пост)
SABROG, строка хранится в памяти непрерывно. Это вообщем-то факт (чтобы нормально рабоали c_str и data). Поэтому в классе должен быть только указатель на строку. Никак не сама строка.


Стандарт это не регламентирует в отличие от непрерывной памяти для vector. И  c_str и data  как раз могут не отражать как на самом деле хранится строка. 



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Любитель
Дата 1.8.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Vyacheslav @  1.8.2008,  17:12 Найти цитируемый пост)
Стандарт это не регламентирует в отличие от непрерывной памяти для vector. И  c_str и data  как раз могут не отражать как на самом деле хранится строка. 

Согласен. Но, с точки зрения реализации - зачем нам неконстантная сложность для c_str и data?


--------------------
PM MAIL ICQ Skype   Вверх
vinter
Дата 1.8.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(Vyacheslav @  1.8.2008,  18:12 Найти цитируемый пост)
Стандарт это не регламентирует в отличие от непрерывной памяти для vector. И  c_str и data  как раз могут не отражать как на самом деле хранится строка.

стандарт может и  не регламентирует, но врядли вы найдете реализацию string где итераторы не являются обычными указателями.


--------------------
Мой блог
PM MAIL WWW   Вверх
phprus
Дата 2.8.2008, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Цитата(andrew_121 @ 29.7.2008,  12:45)
Цитата(Lazin @  29.7.2008,  12:34 Найти цитируемый пост)
неужели для обработки одной строки нужно знать все остальные, может как-нибудь, в несколько проходов можно все обработать?

Думаю - ДА.
Это алгоритм унификации слов. Т.е. есть каталог  котором хранятся файлы словарей(простые .txt). Так вот при добавления нового файла, нужно проанализировать все словари на предмет повторения слов. Сами понимаете, итераций...ого-го smile

Задача не очень понятна.
Исходные данные:
1) много файлов содержащих слова
2) новый файл со словами

Возникают вопросы:
Что нужно получить в результате?

В случае если нужно получить один результирующий файл в котором будут все уникальные слова, то имеем элементарную задачу. Сливаем все слова в один файл, сортируем его сортировкой слиянием ( О(n*log(n)) ) и за О(н) удаляем дублирующиеся слова.
Это наиболее быстрое из всех возможных решений, кроме того оно не требовательно к оперативной памяти. В некоторых случаях для решения этой задачи достаточно стандартной *nix'овой утилиты sort аналоги которой есть и под винду.

Если нужно новый файл очистить от тех слов, которые есть в старых файлах, то можно слить все старые файлы в один, отсортировать его, после чего задачу поиска дублей можно решить за один проход по обоим файлам.

Если что-то еще, то уточни задачу, но очень похоже, что ты что-то не то делаешь. Не похоже что-бы подобная задача требовала загрузки всех данных в память.

Хэш-таблицы тут не подойдут, так как потребуется дополнительное время на из создание, а во вторых в связи с возможностью коллизий при каждом поиске нужно будет сравнивать не только вычислять и сравнивать хэш-коды, но и сравнивать сами строки, что приведет фактически к 2-х кратному росту числа проходов по данным.
PM MAIL WWW ICQ   Вверх
W4FhLF
Дата 2.8.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(phprus @  2.8.2008,  18:44 Найти цитируемый пост)
Сливаем все слова в один файл, сортируем его сортировкой слиянием ( О(n*log(n)) )


Ну это в теории конечно так красиво. Попробуй отсортировать файл с 10 млн. слов, это займёт никак не меньше времени, чем просчёт и построение хеш-таблиц.

Цитата(phprus @  2.8.2008,  18:44 Найти цитируемый пост)
а во вторых в связи с возможностью коллизий


Приведи такую коллизию для двух реально существующих слов в нашем или английском языке хотя бы для функции adler32. 


Это сообщение отредактировал(а) W4FhLF - 2.8.2008, 18:59


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Mayk
Дата 2.8.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(phprus @  2.8.2008,  22:44 Найти цитируемый пост)

В случае если нужно получить один результирующий файл в котором будут все уникальные слова, то имеем элементарную задачу. Сливаем все слова в один файл, сортируем его сортировкой слиянием ( О(n*log(n)) ) и за О(н) удаляем дублирующиеся слова.


а вообще можно и не руками писать. а юзать готовое 

Цитата(Lazin @  29.7.2008,  16:16 Найти цитируемый пост)

такой массив данных нужно хранить на в файле или в БД... 


Цитата(SABROG @  29.7.2008,  17:00 Найти цитируемый пост)

Может есть смысл воспользоваться одной из баз данных ? В них уже реализованы алгоритмы поиска, сравнения, индексации, экономии памяти и т.д.

говорят, что современные базы данных умееют импортировать тектсовые файлы.



Это сообщение отредактировал(а) Mayk - 2.8.2008, 19:15


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
phprus
Дата 2.8.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Цитата(W4FhLF @  2.8.2008,  18:55 Найти цитируемый пост)
Ну это в теории конечно так красиво. Попробуй отсортировать файл с 10 млн. слов, это займёт никак не меньше времени, чем просчёт и построение хеш-таблиц.

Проверял. Файл из 10 млн. строк длинной от 5 до 25 символов ( 152 Мб ) сотритуется на моем ноутбуке утилитой sort за 2 минуты 13 секунд.

Хэш-таблица может быть более ресурсоемкой, так как требует дополнительных сравнений строк, что-бы разрешать возможные коллизии. Кроме того если сами сравниваемые строки хранить на диске, то в результате будет много чтений из различных участков файла, а это гораздо медленнее непрерывного чтения в случае сортированных файлов.


Цитата(W4FhLF @  2.8.2008,  18:55 Найти цитируемый пост)
Приведи такую коллизию для двух реально существующих слов в нашем или английском языке хотя бы для функции adler32. 

В английском языке потенциально бесконечное количество слов. 2^32 меньше бесконечности, по этому коллизии будут.

Кстати я совсем забыл о существовании утилиты comm, которая умеет вот что:
Цитата

comm — утилита unix, читает файл1 и файл2, которые должны быть предварительно лексически отсортированы, и генерирует вывод, состоящий из трёх колонок текста: строки, найденные только в файле файл1; строки, найденные только в файле файл2; и строки, общие для обоих файлов. Имя файла «-» означает стандартный ввод. Перед каждой колонкой будет напечатано столько символов табуляции, сколько печатается колонок с меньшими номерами. Например, если вывод второй колонки подавляется, то перед строками, печатаемыми в первой колонке, символов табуляции не будет совсем, а перед строками в третьей колонке будет напечатан один символ табуляции.

Утилита comm предполагает, что файлы были предварительно лексически отсортированы; все символы участвуют в сравнении строк.

Параметры запуска

-1  Подавить вывод первой колонки.
-2 Подавить вывод второй колонки.
-3 Подавить вывод третьей колонки.
-i Нечувствительное к регистру сравнение строк. 

Следовательно задача автора темы в случае файлов может решиться вообще без программирования.
PM MAIL WWW ICQ   Вверх
W4FhLF
Дата 3.8.2008, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(phprus @  2.8.2008,  21:53 Найти цитируемый пост)
Проверял. Файл из 10 млн. строк длинной от 5 до 25 символов ( 152 Мб ) сотритуется на моем ноутбуке утилитой sort за 2 минуты 13 секунд.


Ну так сложно оценить. Может этот файл уже был близок к отсортированному состоянию?

Однако просчёт 10 миллинов хешей на процессоре 3гц займёт ~1 сек. smile 

Цитата(phprus @  2.8.2008,  21:53 Найти цитируемый пост)
Хэш-таблица может быть более ресурсоемкой, так как требует дополнительных сравнений строк, что-бы разрешать возможные коллизии.


Цитата(phprus @  2.8.2008,  21:53 Найти цитируемый пост)
В английском языке потенциально бесконечное количество слов. 2^32 меньше бесконечности, по этому коллизии будут.


Да коллизии здесь не аргумент. Число существующих слов не бесконечно. Вероятность сущестсования коллизии не нулевая, но она слишком мала. В крайнем случае можно взять 64 битную хеш-функцию. Тогда на 32х битных системах сравнение будет выполняться за 2 такта в худшем случае, а на 64 битных за 1. 
Допустим для подчёта контрольной суммы файлов любых размеров в интернете используется md5. Почему-то ещё никто не наткнулся на коллизию, но её вероятность тоже не нулевая.


Это сообщение отредактировал(а) W4FhLF - 3.8.2008, 10:33


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
phprus
Дата 3.8.2008, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Цитата(W4FhLF @  3.8.2008,  06:51 Найти цитируемый пост)
Ну так сложно оценить. Может этот файл уже был близок к отсортированному состоянию?

Маловероятно. Но что-бы нормально оценить нужно взять данные автора и сравнить время работы.

Цитата(W4FhLF @  3.8.2008,  06:51 Найти цитируемый пост)
Однако просчёт 10 миллинов хешей на процессоре 3гц займёт ~1 сек. smile 

Процессора... А сколько памяти займет такая табличка? Она во первых потребует загрузить все слова в память, а ва вторых еще место под саму хэш-таблицу. Кроме того хэш-таблицу в памяти нужно будет каждый раз перестраивать, а вот один раз отсортированные файлы повторной сортировки не требуют.


Цитата(W4FhLF @  3.8.2008,  06:51 Найти цитируемый пост)

Да коллизии здесь не аргумент. Число существующих слов не бесконечно. Вероятность сущестсования коллизии ненулевая, но она слишком мала. В крайнем случае можно взять 64 битную хеш-функцию. Тогда на 32х битных системах сравнение будет выполняться за 2 такта в худшем случае, а на 64 битных за 1.

Возьмем 64 битную хэшфункцию. Она даст нам 2^64 степени комбинаций. Предположим, что у нас такая мегафункция, что она все слова отобразила в разные значения. НО тут возникает проблема, что мы физически не можем создать хэш-таблицу с 2^64 ячеек. По этому придется этот хэш усекать и вот тут уже вероятность появления коллизий значительно возрастает, по этому приходится применять меры по разрешению коллизий и как следствие либо все данные в память, либо большое количество дорогих дисковых операций.


Цитата(W4FhLF @  3.8.2008,  06:51 Найти цитируемый пост)
Допустим для подчёта контрольной суммы файлов любых размеров в интернете используется md5. Почему-то ещё никто не наткнулся на коллизию, но её вероятность тоже ненулевая.

Для md5 можно подобрать второй файл с таким-же хэш-кодом. Кроме того задача контрольных сумм не требует 100% отсутствия коллизий.
PM MAIL WWW ICQ   Вверх
SABROG
Дата 3.8.2008, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Для контрольной суммы пойдет и простой CRC32. Контрольная сумма и хэш разные вещи. Я не думаю что в DirectConnect просто так юзают TTH, а не Adler32.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
W4FhLF
Дата 3.8.2008, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(phprus @  3.8.2008,  09:17 Найти цитируемый пост)
А сколько памяти займет такая табличка?


Смотря что в ней хранить помимо самого хеша, если упор на скорость то ещё позицию слова и длину хранить надо. Ну для 10 млн. слов метров 100 отожрёт. 


Цитата(phprus @  3.8.2008,  09:17 Найти цитируемый пост)
Она во первых потребует загрузить все слова в память


Слова в памяти хранить как раз нет никакой необходимости. Можно читать файл порциями по 10-20 мегабайт и строить таблицу. 

А для сортировки что меньше памяти надо? Там-то как раз весь файл в памяти иметь нужно. 

Цитата(phprus @  3.8.2008,  09:17 Найти цитируемый пост)
 НО тут возникает проблема, что мы физически не можем создать хэш-таблицу с 2^64 ячеек.


Зачем нам такая таблица? Кол-во записей == кол-ву слов. 

Цитата(phprus @  3.8.2008,  09:17 Найти цитируемый пост)
Для md5 можно подобрать второй файл с таким-же хэш-кодом.


Можно? Ну попробуй подобрать или хотя бы в сети найти примеры таких файлов smile 

Нет, я понимаю теория великая вещь. В ней столько всего возможно, но вот практика штука более ограниченная и в ней приходится делать некоторые допущения и это будет всё прекрасно работать и решать поставленную задачу. В данной теме интерес именно прикладной, т.е. теория меня здесь не особо интересует.

Добавлено через 12 минут и 54 секунды
Цитата(SABROG @  3.8.2008,  09:21 Найти цитируемый пост)
Я не думаю что в DirectConnect просто так юзают TTH, а не Adler32.


Ты прав. Я собственно adler32 предложил просто как пример очень быстрой функции и с учётом экономии памяти. Это даже не хеш-функция как таковая smile Ну все же понимают, что чудес не бывает. Надо исходить из поставленной задачи. 

Вот было бы интересно взять какой-нибудь более или менее полный словарь русского/английского и посмотреть будут ли там коллизии. Вопрос где взять такой словарь?

Это сообщение отредактировал(а) W4FhLF - 3.8.2008, 10:33


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
phprus
Дата 3.8.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Цитата(W4FhLF @  3.8.2008,  10:26 Найти цитируемый пост)
Слова в памяти хранить как раз нет никакой необходимости. Можно читать файл порциями по 10-20 мегабайт и строить таблицу. 

Это потребуется для разрешения коллизий. Либо все слова держать в памяти, либо в хэш-таблице придется хранить смещения в файлах данных, но это приведет к огромным дисковым тормозам.

Цитата(W4FhLF @  3.8.2008,  10:26 Найти цитируемый пост)
А для сортировки что меньше памяти надо? Там-то как раз весь файл в памяти иметь нужно. 

А про алгоритмы внешней сортировки вы не слышали? Расход оперативной памяти можно сделать очень маленьким.

Цитата(W4FhLF @  3.8.2008,  10:26 Найти цитируемый пост)
Зачем нам такая таблица? Кол-во записей == кол-ву слов. 

Поиск по переполненной хэш-таблице вещь чрезвычайно медленная. Количество ячеек в таблице должно быть как минимум на треть больше чем количество записей в ней и и то при таком количестве пустых ячеек коллизии будут.

Кстати а можно поинтересоваться вы вообще хоть какие-либо алгоритмы сортировки знаете? А хэш-таблицы реализовывали? Судя по тому, что вы не знаете основ говорит о том, что все-же нет.

Цитата(W4FhLF @  3.8.2008,  10:26 Найти цитируемый пост)
Нет, я понимаю теория великая вещь. В ней столько всего возможно, но вот практика штука более ограниченная и в ней приходится делать некоторые допущения и это будет всё прекрасно работать и решать поставленную задачу. В данной теме интерес именно прикладной, т.е. теория меня здесь не особо интересует.

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

Цитата(W4FhLF @  3.8.2008,  10:26 Найти цитируемый пост)
Вот было бы интересно взять какой-нибудь более или менее полный словарь русского/английского и посмотреть будут ли там коллизии.

Алгоритм хэширования коллизий может и не дать, НО в хэш-таблице коллизии будут. Если конечно размер таблицы будет адекватный, а не такой, что количество ячеек будет равно количеству возможных значений хэш-кодов.
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0650 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.