С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/211: Рейтинг темы: голосов - 211, средняя оценка - 4.85
1 / 1 / 1
Регистрация: 11.04.2011
Сообщений: 109
1

Хеш функция

18.10.2012, 22:42. Показов 39857. Ответов 31
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Помогите с задачей.

Таблица строиться по методу цепочек с использованием хэш-функции, возращающий код первой буквы идентификатора. При выполнений программы подсчитывается число коллизий.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.10.2012, 22:42
Ответы с готовыми решениями:

Хеш функция
Всем добрый день! В общем, нужно подсчитать кол-во коллизий. За это отвечает функция size_t...

Шаблоны. Хеш-функция
Добрые день. Есть задание сделать телефонную книгу. Поиск в базе сделать через хеш-функцию. ...

Хеш-функция, двойное хеширование
Всем привет! Пишу курсач, нужна хеш-функция, которая принимала бы строку и возвращала некий...

Хеш-функция и вывод в ассоциативный массив
Всем привет, есть функция, которая хеширует некоторую строку. Не знаю как добавить вывод пары...

31
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,934
19.10.2012, 08:56 2
в гугле забанили?
Хэш-таблица. Метод цепочек. C++
1
1 / 1 / 1
Регистрация: 11.04.2011
Сообщений: 109
19.10.2012, 18:03  [ТС] 3
Спасибо, но там задание сумму первых 2 букв, а у меня код первой буквы идентификатора
0
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
24.10.2012, 10:33 4
MerlinLegend, да, разница настолько велика, что одним постом и не охватить...
Замените функцию hash на такую:
C++
1
2
3
4
size_t hash(const Identifier& id)
{
    return size_t(id.name()[0]);
}
Для подсчёта числа коллизий можно вставить в класс HashTable такой метод:
C++
1
2
3
4
5
6
7
8
9
10
size_t collisions_count() const
{
    size_t result = 0;
    
    for (size_t i = 0; i < hasn_table_size; ++i)
        if (m_hash_table[i].size() > 1)
            ++result;
    
    return result;
}
1
1 / 1 / 1
Регистрация: 11.04.2011
Сообщений: 109
24.10.2012, 19:17  [ТС] 5
Спасибо за помощь, но одна проблема

у меня не объявлены переменные я их объявил, но все равно ничего не получается
0
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.10.2012, 11:47 6
MerlinLegend, очень информативно. А теперь представьте, что вы не видели код своей программы, и прочтите ваше сообщение. Вы что-нибудь можете из него вынести? Что-нибудь, что могло бы натолкнуть вас на идею, в чём же проблема?
Если не поняли, то вот прямым текстом: как было, что сделали, как стало? Что значит "ничего не получается"? Не включается компьютер? Или музыка играть не начинает? Или всё-таки программа не компилируется или падает в процессе выполнения? И если не компилируется, то что говорит компилятор?
1
1 / 1 / 1
Регистрация: 11.04.2011
Сообщений: 109
25.10.2012, 12:36  [ТС] 7
Да вы правы. Ошибка на переменные которые не объявлены.
0
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.10.2012, 12:36 8
MerlinLegend, видимо, недостаточно прав. Код показывайте.
1
1 / 1 / 1
Регистрация: 11.04.2011
Сообщений: 109
25.10.2012, 14:04  [ТС] 9
C
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include <iostream>
#include <string>
#include <list>
#include <algorithm>
 
// Класс "Идентификатор"
// Поскольку это только пример, то в данном случае является просто обёрткой над
// строкой. В реалиности может содержать много дополнительной информации, такой,
// как тип переменной, признак используемости, уровень вложенности и так далее.
class Identifier
{
public:
    // Задаётся имя переменной при создании
    Identifier(const std::string &name):
    m_name(name)
    {
    }
 
public:
    // Получается имя переменной
    std::string name() const
    {
        return m_name;
    }
    
private:
    std::string m_name;
};
 
// Необходимо для поиска переменной по имени
bool operator==(const Identifier &left, const Identifier &right)
{
    return left.name() == right.name();
}
 
// Функция, вычисляющая хэш
// Принимает идентификатор, хэш которого надо посчитать
// Возвращает вычисленный хэш
size_t hash(const Identifier& id)
{
    return size_t(id.name()[0]);
}
// Класс исключение "Идентификатор не найден"
// Нужен для выдачи сообщения о том, что идентификатор не найден в таблице,
// наружу функции поиска идентификатора
class IDNotFoundException : std::exception
{
public:
    IDNotFoundException(const std::string id_name):
    m_what(std::string("Identifier \'") + id_name + "\' not found!")
    {
    }
    
    virtual ~IDNotFoundException() throw()
    {
    }
    
public:
    const char *what() const throw()
    {
        return m_what.c_str();
    }
    
private:
    std::string m_what;
};
 
// Класс "Хэш-таблица", основанная на методе цепочек
// Метод цепочек заключается в следующем: таблица представляет собой массив
// связных списков фиксированного размера. Вычисленный хэш-функцией хэш является
// индексом в этом массиве списков. Известно, что список по этому индексу будет
// содержать все идентификаторы, для которых функция вернула одинаовый хэш.
// Осталось только найти идентификатор в данном списке и возвратить ссылку на
// него.
class HashTable
{
public:
   size_t collisions_count() const
{
    size_t result = 0;
    
    for (size_t i = 0; i < hasn_table_size; ++i)
        if (m_hash_table[i].size() > 1)
            ++result;
    
    return result;
}
public:
    // Добавление идентификатора в хэш-таблицу
    void add(const Identifier &id)
    {
        // Добавление идентификатора в список, расположенный в таблице по
        // индексу, вычисленному хэш-функцией (с учётом смещения)
        m_hash_table[hash(id) - min_hash_value].push_back(id);
    }
    
    // Поиск идентификатора в таблице по имени
    Identifier &get(const std::string &id_name)
    {
        // Сохраняется ссылка на список, в котором потенциально будет
        // расположен идентификатор (для простоты)
        std::list<Identifier>& line = m_hash_table[hash(id_name) - min_hash_value];
        
        // Поиск идентификаторы в списке по имени
        std::list<Identifier>::iterator it =
            std::find(line.begin(), line.end(), id_name);
        
        // Если при поиске были просмотренны все элементы списка,и ни один не
        // подошёл - сообщаем о том, что идентификатор не найден, посредством
        // исключения
        if (it == line.end())
            throw IDNotFoundException(id_name);
        
        // Если идентификатор найден - возвращаем ссылку на него
        return *it;
    }
    
private:
    // Хэш-таблица - массив связных списков идентификаторов
    std::list<Identifier> m_hash_table[hash_table_size];
};
 
int main()
{
    // Создаём хэш-таблицу
    HashTable ht;
    
    // Добавляем в неё различные идентификаторы
    ht.add(Identifier("a"));
    ht.add(Identifier("aa"));
    ht.add(Identifier("if"));
    ht.add(Identifier("fi"));
    
    // На случай, если идентификатор не будет найден, заворачиваем код поиска
    // идентификаторов в блок try/catch
    try
    {
        // Выводим на экран информацию о различных идентификаторах
        std::cout << ht.get("a").name() << std::endl;
        std::cout << ht.get("aa").name() << std::endl;
        std::cout << ht.get("if").name() << std::endl;
        std::cout << ht.get("fi").name() << std::endl;
        // Проверяем случай, когда идентификатор не должен быть найден
        std::cout << ht.get("hello").name() << std::endl;
    }
    catch (const IDNotFoundException &ex)
    {
        // Если идентификатор не найден - сообщаем об этом
        std::cerr << ex.what() << std::endl;
    }
    
    return 0;
}
0
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.10.2012, 14:07 10
MerlinLegend, е-моё... Так это программа сама ругается на необъявленный идентификатор? Так и должно быть, я специально показал её реакцию на попытку поиска в таблице отсутствующей записи. Вы пробовали разбираться в коде вообще? Вы понимаете, чего от вас хотят в задании?

Добавлено через 52 секунды
Я же даже комментарий написал специально для... А, ладно...
Строка 143-144:
C++
1
2
// Проверяем случай, когда идентификатор не должен быть найден
std::cout << ht.get("hello").name() << std::endl;
0
1 / 1 / 1
Регистрация: 11.04.2011
Сообщений: 109
25.10.2012, 17:17  [ТС] 11
и что в этой строке не так?
0
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.10.2012, 17:20 12
MerlinLegend, в этой строке сказано, что специально проверяется случай поиска идентификатора в таблице в то время, когда такого идентификатора там нет. Или у вас всё-таки компилятор ругается на необъявленные переменные? Вообще, почему мне приходится на протяжении 5 сообщений вытягивать из вас информацию? Кому из нас двоих нужна помощь?
0
1 / 1 / 1
Регистрация: 11.04.2011
Сообщений: 109
25.10.2012, 18:19  [ТС] 13
Мне нужна помощь. компилятор ругается на необъявленные переменные
0
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.10.2012, 18:37 14
MerlinLegend, вы читать умеете?
Цитата Сообщение от silent_1991 Посмотреть сообщение
И если не компилируется, то что говорит компилятор?
0
Комп_Оратор)
Эксперт по математике/физике
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.10.2012, 18:46 15
Цитата Сообщение от MerlinLegend Посмотреть сообщение
Мне нужна помощь. компилятор ругается на необъявленные переменные
MerlinLegend, это Ваш вывод о том, что выводит компилятор. А Вы возьмите и скопируйте содержимое output window debugera, а потом выкладывайте его сюда. Съэкономите время.
0
1 / 1 / 1
Регистрация: 11.04.2011
Сообщений: 109
25.10.2012, 18:52  [ТС] 16
(121): error C2065: hash_table_size: необъявленный идентификатор
(83): error C2065: hasn_table_size: необъявленный идентификатор
(95): error C2065: min_hash_value: необъявленный идентификатор
(95): error C2228: выражение слева от ".push_back" должно представлять класс, структуру или объединение
(103): error C2065: min_hash_value: необъявленный идентификатор
0
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.10.2012, 18:58 17
MerlinLegend, а, ну ё-моё, правильно. Вы зачем из кода что-то удаляли?

Добавлено через 49 секунд
Я же не говорил "замените объявление трёх полей класса на метод collisions_count". Я сказал "добавить в класс метод".

Добавлено через 1 минуту
C++
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <iostream>
#include <string>
#include <list>
#include <algorithm>
 
class Identifier
{
public:
    Identifier(const std::string& name):
    m_name(name)
    {
    }
    
public:
    std::string name() const
    {
        return m_name;
    }
    
private:
    std::string m_name;
};
 
bool operator==(const Identifier& left, const Identifier& right)
{
    return left.name() == right.name();
}
 
size_t hash(const Identifier& id)
{
    return size_t(id.name()[0]);
}
 
class IDNotFoundException : std::exception
{
public:
    IDNotFoundException(const std::string id_name):
    m_what(std::string("Identifier \'") + id_name + "\' not found!")
    {
    }
    
    virtual ~IDNotFoundException() throw()
    {
    }
    
public:
    const char *what() const throw()
    {
        return m_what.c_str();
    }
    
private:
    std::string m_what;
};
 
class HashTable
{
public:
    static const size_t min_hash_value = int('A') + int('0');
    static const size_t max_hash_value = int('z') + int('z');
    static const size_t hash_table_size = max_hash_value - min_hash_value;
    
public:
    void add(const Identifier& id)
    {
        m_hash_table[hash(id) - min_hash_value].push_back(id);
    }
    
    Identifier& get(const std::string& id_name)
    {
        std::list<Identifier>& line = m_hash_table[hash(id_name) - min_hash_value];
        
        std::list<Identifier>::iterator it =
            std::find(line.begin(), line.end(), id_name);
        
        if (it == line.end())
            throw IDNotFoundException(id_name);
        
        return *it;
    }
    
    size_t collisions_count() const
    {
        size_t result = 0;
        
        for (size_t i = 0; i < hasn_table_size; ++i)
            if (m_hash_table[i].size() > 1)
                ++result;
        
        return result;
    }
    
private:
    std::list<Identifier> m_hash_table[hash_table_size];
};
 
int main()
{
    HashTable ht;
    
    ht.add(Identifier("a"));
    ht.add(Identifier("aa"));
    ht.add(Identifier("if"));
    ht.add(Identifier("fi"));
    
    try
    {
        std::cout << ht.get("a").name() << std::endl;
        std::cout << ht.get("aa").name() << std::endl;
        std::cout << ht.get("if").name() << std::endl;
        std::cout << ht.get("fi").name() << std::endl;
        std::cout << ht.get("hello").name() << std::endl;
    }
    catch (const IDNotFoundException& ex)
    {
        std::cerr << ex.what() << std::endl;
    }
    
    return 0;
}
Наслаждайтесь.

Добавлено через 1 минуту
М, вот ещё что. Размер хэш-таблицы тоже поменялся. Поэтому строки 59-60 надо заменить на такие:
C++
1
2
    static const size_t min_hash_value = int('0');
    static const size_t max_hash_value = int('z');
1
1 / 1 / 1
Регистрация: 11.04.2011
Сообщений: 109
25.10.2012, 19:12  [ТС] 18
Спасибо за помощь. Но у меня снова ошибка (87): error C2065: hasn_table_size: необъявленный идентификатор
0
Эксперт С++
5057 / 3117 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
25.10.2012, 19:14 19
MerlinLegend, ну как он может быть необъявленным, если он объявляется в 61 строке? Вы опять что-то лишнее удалили?
0
1 / 1 / 1
Регистрация: 11.04.2011
Сообщений: 109
25.10.2012, 19:16  [ТС] 20
Нет, все как вы вы говорили
0
25.10.2012, 19:16
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.10.2012, 19:16
Помогаю со студенческими работами здесь

Объясните как работает хеш-функция
int Hash_Function1(DrugStore object) { int result = 0; for (int i = 0; i &lt;...

Хеш-функция и вывод в ассоциативный массив
Всем привет, есть функция, которая хеширует некоторую строку. Не знаю как добавить вывод пары...

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

Метод открытого хеширования и хеш-функция, основанная на методе деления с остатком
Ещё раз здравствуйте! Есть такое задание: Написать программу, которая реализует метод...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта Gowin Eda и снимок. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
Как создать нейросеть для генерации картинок на Python
InfoMaster 12.01.2025
Генерация изображений с помощью искусственных нейронных сетей стала одним из наиболее захватывающих направлений в области компьютерного зрения и машинного обучения. В этой статье мы рассмотрим. . .
Создание нейросети для генерации текста на Python
InfoMaster 12.01.2025
Нейросети, или искусственные нейронные сети, представляют собой модели машинного обучения, вдохновленные работой человеческого мозга. Они состоят из множества взаимосвязанных узлов, или "нейронов",. . .
Как создать нейросеть распознавания изображений на Python
InfoMaster 12.01.2025
Введение в распознавание изображений с помощью нейросетей Распознавание изображений с помощью нейронных сетей стало одним из самых впечатляющих достижений в области искусственного интеллекта. Эта. . .
Основы искуственного интеллекта
InfoMaster 12.01.2025
Искусственный интеллект (ИИ) представляет собой одну из наиболее динамично развивающихся областей современной науки и технологий. В широком смысле под искусственным интеллектом понимается способность. . .
Python и нейросети
InfoMaster 12.01.2025
Искусственные нейронные сети стали неотъемлемой частью современных технологий, революционизировав множество областей - от медицинской диагностики до автономных транспортных средств. Python, благодаря. . .
Python в машинном обучении
InfoMaster 12.01.2025
Python стал неотъемлемой частью современного машинного обучения, завоевав позицию ведущего языка программирования в этой области. Его популярность обусловлена несколькими ключевыми факторами, которые. . .
Создание UI на Python с TKinter
InfoMaster 12.01.2025
TKinter — это одна из наиболее популярных библиотек для создания графических интерфейсов пользователей (GUI) в языке программирования Python. TKinter входит в стандартную библиотеку Python, что. . .
HTML5 в разработке мобильных приложений
InfoMaster 12.01.2025
Введение: Обзор роли HTML5 в мобильной разработке В современном мире мобильных технологий HTML5 стал ключевым инструментом для разработки кроссплатформенных приложений. Эта технология произвела. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru