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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2010, 17:21   #1
Познающий
Форумчанин
 
Аватар для Познающий
 
Регистрация: 09.05.2009
Сообщений: 162
По умолчанию

В общем голова распухла с лабой по хешированию... да,кстати, всем привет...
В общем проблема такая
Код:
if (tab[h]->index==-1)
	tab[h]->index=i;
	else
		if( extratab[tab[h]->index]->index==-1)
		extratab[tab[h]->index]->index=i;
		else
			extratab[extratab[tab[h]->index]->index]->index=i;
По-русски это значит что у нас есть две таблицы- основная и не очень.
h - это результат хеш-функции, оная указывает нам каким индексом обязан будет обладать элемент в основной таблице. Если указываемый АШем индекс уже занят, то мы идем в не очень основную таблицу и там в первом же свободном поле пишем этот элемент,а в поле index уже занятой ячейки в осн табл пишем индекс, который занял новый элемент.
Представим, что хеш дало 8. Пишем в 8ю ячейку инфу. Хеш опять дало 8, для других данных. Значит пишем в 0ю ячейку доп.таблицы этот элемент, и делаем tab[8]->index=0 (эт для наглядности не подумайте )
Опять хеш дает 8, а в главной таблице поле индекс забито, значит делается то же что и тогда, только в 1-ю ячейку пишутся данные (осн таблицы) только поле "индекс" переписывается уже в нулевой яче доп табл...

Проблема - не могу организовать рекурсию (я думаю что здесь рекурсия нужна)с таким усмотром, что у нас колизийных элементов бесконечно много...( а не пачка if, else)
В общем код что вверху надо просто организовать рекурсивно... Мне уже к завтра сдавать, помогите додумать, а то brain power идет уже к zero...

tab - основная таблица
extratab- дополнительная таблица
i- индекс в доп.таблице (чтоб по новой не проходить таблицу сохраняем индекс последнего занесенного эл-та)
h- результат хеш-функции

похоже тут надо цикл...

Код:
if (tab[h]==NULL) 
	tab[h]=tmp;
else {
	if (tab[h]->index==-1)
	tab[h]->index=i;
	else
	{
		int tabind=tab[h]->index;
		do{
			if( extratab[tabind]->index==-1)break;
		else tabind=extratab[tabind]->index;
		}while (extratab[tabind]->index!=-1);
		extratab[tabind]->index=i; 
	} // находим последний колиз элемент

	extratab[i]=tmp; i++; //заносим данн
С наилучшими пожеланиями.

Последний раз редактировалось Stilet; 08.02.2010 в 09:41.
Познающий вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ програмка для решения примера askerpro Помощь студентам 0 17.09.2009 21:16
Пишу курсовую нужно решить задачу для примера на геометрическую прогрессию (Pascal) =|винтик|= Помощь студентам 4 25.05.2009 16:38
Решение мат. примера Kashp Помощь студентам 2 21.09.2008 11:19
Помогите организовать добавление в memo или listbox... Arkuz Компоненты Delphi 6 25.04.2008 18:16