LINUX.ORG.RU

Те чо надо сделать ? Хеш-таблицу ? Набери в гугле "хеш-функция" или "хеш-таблица".

anonymous
()
Ответ на: комментарий от anonymous

я уж нашел в гугле экзампл:

#include <stdio.h>
#include <search.h>

char *data[] = { "alpha", "bravo", "charlie", "delta",
   "echo", "foxtrot", "golf", "hotel", "india", "juliet",
   "kilo", "lima", "mike", "november", "oscar", "papa",
   "quebec", "romeo", "sierra", "tango", "uniform",
   "victor", "whisky", "x-ray", "yankee", "zulu"
};

int main() {
  ENTRY e, *ep;
  int i;
  hcreate(30);
  for (i = 0; i < 24; i++) {
    e.key = data[i];
    e.data = (char *)i;
    ep = hsearch(e, ENTER);
    if (ep == NULL) {
      fprintf(stderr, "entry failed\n");
      exit(1);
    }
  }
  for (i = 22; i < 26; i++) {
    e.key = data[i];
    ep = hsearch(e, FIND);
    printf("%9.9s -> %9.9s:%d\n", e.key,
      ep ? ep->key : "NULL",
      ep ? (int)(ep->data) : 0);
  }
  return 0;
}

теперь буду долбацца с тем, чтобы передавать 
хеш в функцию, там дозаполнять его и возвращать обратно.

vilfred ☆☆
() автор топика

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

Классическая универсальная и быстрая хэш-функция для строк
получается, если проXORить все элементы с левым циркулярным 
сдвигом, коллизий обычно гораздо меньше, чем при простом 
суммировании элементов.

Только надо сначала определить число битиков в беззнаковом
целом. В принципе, по стандарту есть макро CHAR_BIT, но
можно подсчитать напрямую:

/*(How many bits are in an integer) - 1:*/
int bits_in_int_1;
/*Initialize bits_in_int_1:*/
void first_init(void)
{
unsigned int j;
   for(bits_in_int_1=0,j=1;j;j<<=1,bits_in_int_1++);
   bits_in_int_1--;
}

Потом можно пользоваться функцией:
/*The hash function for the string "tag", 
  "tsize" is the table size:*/
unsigned int str_hash(char *tag, unsigned int  tsize)
{
 unsigned int mem=0;
   while(*tag){
     mem=(mem<<1)|(mem>>bits_in_int_1); /*left circular shift*/
     mem^=*tag++;
   }
   return(mem % tsize);
}

Die-Hard ★★★★★
()
Ответ на: комментарий от vilfred

vilfred (12.09.2005 20:58:55):

Хрестоматийный пример с приведенной мной функцией:

http://www.citforum.ru/programming/c_unix/ex_7.shtml

Только _очень_ отстойно все накодено, за такой код надо гнать нахрен. Но идея прозрачная.

Die-Hard ★★★★★
()
22 октября 2005 г.
Ответ на: комментарий от Die-Hard

слушай, получилось!!! Спасибо! оконтуривает произвольное число объектов :))) наконец-то.

vilfred ☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.