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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Текстовый файл и ХЕШ таблица ??? -- синхронизация -- 
:(
    Опции темы
Syberex
Дата 22.9.2006, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Трабла такая, есть текстовый файл 1,6 мегабайта, там 170 000 слов, в конце слов энтеры, необходимо убрать и создать хеш таблицу.
Требования: поиск, запись, чтение.И самое главное чтоб быстро работало .Как сделать??? Поиск в масиве таким способом идёт 200 раз в секунду проход 1,6 мегобайта, но я хочу хеш, чтоб можно было слова и во внутрь добовлять. Что такое хеш я знаю, но вот как это слепить воедино так и не нашёл. Кто подскажет? 
     int handle=open("D:\\slovar11.txt",O_CREAT);  //0x0100
     long LenFile=filelength(handle);
     close (handle);
     fstream in("D:\\slovar11.txt");
     char *ch=new char[LenFile];
     in.read(ch,LenFile);
     in.close();
     ........
     ........
     delete ch;
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
_hunter
Дата 22.9.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



а почему бы std::map не юзать?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Syberex
Дата 22.9.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



вот чёто я не долюбливаю эту стд, органически у меня к ней не сварение. А примерчик есть?
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
_hunter
Дата 22.9.2006, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



std::map<std::string, int> someMap;
...
someMap[word] = id++;


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Syberex
Дата 22.9.2006, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



мне это не очём не говорит  smile 
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
kondr
Дата 22.9.2006, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

std::map<std::string, int> someMap;
...
someMap[word] = id++;


А зачем в качестве ключа строку использовать? Если хэш будет расчитываться, то ключом должно быть некоторое числовое значение. А вообще я не понимаю зачем тут хэш. Просто использовать set<string>  и все. Слова будут лексикографически упорядочены и поиск бинарный.  Ну вставка (в смысле начальное считывание слов в set) конечно будет немного медленновата, но это ж только один раз...   

Хотя поиск по строкам наверное дорого стоит... Может действительно хэш лучше... 

Это сообщение отредактировал(а) kondr - 22.9.2006, 14:52
PM MAIL   Вверх
kondr
Дата 22.9.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Короче вот так я бы сделал:
Код


#include <iostream>
#include <fstream>
#include <string>
#include <map>

using namespace std;

int hash(string s)
{
    //Считаем хэш для строки
}

class Dictionary
{
public:
    Dictionary(char* dictfile)
    {
        dictFileName = dictfile;
    };
    
    int readDictFile()
    {
        ifstream dictFile;
        string word;

        dictFile.open(dictFileName.c_str());
        
                if (dictFile)
        {
            dictMap.clear();

            while (!dictFile.eof())
            {
                 getline(dictFile,word);
                 dictMap.insert(make_pair(hash(word),word)); //make_pair - создает пару ключ-значение
            }

            dictFile.close();
            return 0;
        }

        return -1;
    }

    string* Search(string & word)
    {
        map <int,string>::iterator it = dictMap.find(hash(word));
        if (it == dictMap.end()) return NULL;
        return &it->second;  //Возвращаем укащатель на значение, ассоциированное с хэшем или нул                        
    }

    ~Dictionary(){};

private:
    string dictFileName;
    map <int,string> dictMap;
};


убого, но смысл понятен smile . 

PM MAIL   Вверх
_hunter
Дата 22.9.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



Цитата(kondr @  22.9.2006,  14:41 Найти цитируемый пост)
А зачем в качестве ключа строку использовать?

а что еще ключем может быть???


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Syberex
Дата 25.9.2006, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ребят всё конечно круто, но мне одного не понятно, хеш должен возвращать указатель на значение в файле, токо одна МАЛЕНЬКАЯ проблемка, как она его вернёт правильно, если если слова там разной длины, и при всавке и удалении слов, даже 10-ка, уже идёт сильное смещение указателей, и всё становиться крайне не эффективно, я так подозреваю, что хешь функция должна как-то модифицироваться после каждого слова, а это уже полный бред.  smile  
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
Earnest
Дата 25.9.2006, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 53
Всего: 183



170000 слов - это не так уж много: загрузи в память и не парься. Если все же хочешь работать с файлом, то сделай map строка->позиция в файле. Новые слова добавляй взад. Если нужно удалять - введи дополнительный флаг.
Лучше, конечно, использовать hash_map, а не map, если твоя stl поддерживает.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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