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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2012, 01:10   #1
Rakuz
 
Регистрация: 30.05.2012
Сообщений: 4
По умолчанию C# хеширование

Не могу понять что не так. Тип разрешения коллизий линейное зондирование. При обнаружении такого же ключа запись добавляется в конец списка с идентичным ключем, хотя в принципе должен даваться уникальный ключ. Вот код:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;

namespace Курсовая
{
    public class HashTable
    {
        public Strana[] st;    //массив элементов хеш-таблицы
        int n, m;   //количество элементов в хеш-таблице, максимальное количество элементов в хеш-таблицы
        Strana nullItem;   //пустой элемент

        public HashTable(int maxN)  //конструктор с параметром
        {
            n = 0;
            m = 2 * maxN;
            st = new Strana[m];
            nullItem = null;
        }

        public int Hash(string v, int m) //статический метод - хеш-функция
        {
            int h = 0, a = 127;
            foreach (char ch in v)
                h = (a * h + ch) % m;
            return h;
        }

        public int Count //свойство - количество элементов в хеш-таблице
        {
            get
            {
                return n;
            }
        }

        public void Insert(Strana item)  //метод добавления элемента в хеш-таблицу
        {
            if (Search(item.Key()) != nullItem)
                MessageBox.Show("Такой элемент уже есть в хеш-таблице");
            int i = Hash(item.Key(), m);
            while (st[i] != nullItem)
                i = (i + 1) % m;
            st[i] = item;
            n++;
        }

        public void Remove(Strana x)  //метод удаления элемента из хеш-таблицы
        {
            int i = Hash(x.Key(), m), j;
            while (st[i] != nullItem)
                if (x.Key() == st[i].Key())
                    break;
                else
                    i = (i + 1) % m;
            if (st[i] == nullItem)
                return;
            st[i] = nullItem;
            n--;
            for (j = i + 1; st[j] != nullItem; j = (j + 1) % m, n--)
            {
                Strana v = st[j];
                st[j] = nullItem;
                Insert(v);
            }
        }

        public Strana Search(string v) //метод поиска элемента в хеш-таблице
        {
            int i = Hash(v, m);
            while (st[i] != nullItem)
                if (v == st[i].Key())
                    return st[i];
                else
                    i = (i + 1) % m;
            return nullItem;
        }
    }
}
Поправте пожалуйста если что не так а если так то просто отпишите.
Rakuz вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на хеширование Галания Паскаль, Turbo Pascal, PascalABC.NET 0 08.05.2011 21:55
хеширование rowlin Общие вопросы C/C++ 1 07.05.2011 07:20
Хеширование: Necare Помощь студентам 5 21.03.2011 19:46
Хеширование RunForest Общие вопросы .NET 4 10.08.2009 15:21