Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 1
Регистрация: 06.01.2018
Сообщений: 16
1

Хеш-таблица, метод цепочек, первичный индекс и вторичный индекс

08.01.2018, 18:23. Показов 2482. Ответов 1

Author24 — интернет-сервис помощи студентам
Добрый вечер! Пытаюсь написать программу, которая будет работать как хеш-таблица. Для вычисления первичного индекса используется символьный ключ (строка преобразуется в int по заданному правилу), а вторичный индекс должен вычисляться методом квадратичных проб. И вот с этим у меня загвоздка. В коде отметил где, насколько я понимаю, должен генерироваться этот вторичный индекс, но ума не приложу как это осуществить. Надеюсь на вашу помощь!


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
154
155
156
157
158
159
160
161
162
class Program
{
    static void Main(string[] args)
    { opentable myTable = new opentable();
        myTable.insert(109875, "Anna");
        myTable.insert(103765, "Harry");
        myTable.insert(100364, "Benedict");
        myTable.insert(202120, "Piter");
        myTable.insert(202120, "Piter");
        myTable.insert(202120, "Piter");
 
 
    myTable.print();
 
    Console.ReadKey();
}
} 
//хеш-таблица метод цепочек
class opentable 
{
    class hashnode
    {
        int key;
        string data;
        hashnode next;
        public hashnode(int key, string data)
        {
            this.key = key;
            this.data = data;
            next = null;
        }
        public int getkey()
        {
            return key;
        }
        public string getdata()
        {
            return data;
        }
        public void setNextNode(hashnode obj)
        {
            next = obj;
        }
        public hashnode getNextNode()
        {
            return this.next;
        }
    }
 
    hashnode[] table;
    const int size = 10;
 
    public opentable()
    {
        table = new hashnode[size];
        for (int i = 0; i < size; i++)
        {
            table[i] = null;
        }
    }
    public void insert(int key, string data)
    {
        hashnode nObj = new hashnode(key, data);
        int hash = key % size; // первичный индекс
        while (table[hash] != null && table[hash].getkey() % size != key % size)
        {
            hash = (hash + 1) % size;
        }
        if (table[hash] != null && hash == table[hash].getkey() % size)
        {
           //здесь должен генерироваться вторичный индекс
            nObj.setNextNode(table[hash].getNextNode());
            table[hash].setNextNode(nObj);
            return;
        }
        else
        {
            table[hash] = nObj;
            return;
        }
    }
    public string retrieve(int key)
    {
        int hash = key % size;
        while (table[hash] != null && table[hash].getkey() % size != key % size)
        {
            hash = (hash + 1) % size;
        }
        hashnode current = table[hash];
        while (current.getkey() != key && current.getNextNode() != null)
        {
            current = current.getNextNode();
        }
        if (current.getkey() == key)
        {
            return current.getdata();
        }
        else
        {
            return "nothing found!";
        }
    }
    public void remove(int key)
    {
        int hash = key % size;
        while (table[hash] != null && table[hash].getkey() % size != key % size)
        {
            hash = (hash + 1) % size;
        }
        //a current node pointer used for traversal, currently points to the head
        hashnode current = table[hash];
        bool isRemoved = false;
        while (current != null)
        {
            if (current.getkey() == key)
            {
                table[hash] = current.getNextNode();
                Console.WriteLine("entry removed successfully!");
                isRemoved = true;
                break;
            }
 
            if (current.getNextNode() != null)
            {
                if (current.getNextNode().getkey() == key)
                {
                    hashnode newNext = current.getNextNode().getNextNode();
                    current.setNextNode(newNext);
                    Console.WriteLine("entry removed successfully!");
                    isRemoved = true;
                    break;
                }
                else
                {
                    current = current.getNextNode();
                }
            }
 
        }
 
        if (!isRemoved)
        {
            Console.WriteLine("nothing found to delete!");
            return;
        }
    }
    public void print()
    {
        hashnode current = null;
        for (int i = 0; i < size; i++)
        {
            current = table[i];
            while (current != null)
            {
                Console.Write(current.getdata() + " ");
                current = current.getNextNode();
            }
            Console.WriteLine();
        }
    }
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2018, 18:23
Ответы с готовыми решениями:

Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать разме
int id = 0; id = groups; Ошибка. Индекс за пределами диапазона. Индекс должен быть...

Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать разме
Вот такая ошибка возникла - Как её исправить ?

Хеш-таблица (метод цепочек)
Дано: файл на 1ккк больших чисел. Задача: 1. Построить хеш-таблицу любым методом. 2. Обчислить...

Хеш таблица с функцией (метод цепочек)
1) Не смотрите на хеш функцию, она наитупейшая, я еще над ней не работал. 2)Метод цепочек...

1
0 / 0 / 1
Регистрация: 06.01.2018
Сообщений: 16
09.01.2018, 19:04  [ТС] 2
Пришел к ответу, что в изначальном задании была ошибка. Удалось все сделать. Тему можно закрывать.
0
09.01.2018, 19:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.01.2018, 19:04
Помогаю со студенческими работами здесь

Первичный индекс
Мне кажется почти в каждой таблице есть поле id. Для этого поля применяется индекс Primary. Я хочу...

Хэш-таблица. Метод цепочек. C++
Уважаемые, программисты, задание звучит так: &quot;Таблица строится по методу цепочек с использованием...

Хэш-таблица (метод цепочек)
Пишу частотный словарь текста: Массив списков узлов. В узле значение и частота слова. При написании...

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru