Преобразовать массив в таблицу ha sh или карту ha sh - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть 2 функции: smalltalk и do_smalltalk. smalltalk проверит, соответствует ли пользовательский ввод (намерение) слову, данному в массиве. Если есть совпадение, программа перейдет к do_smalltalk. Мой вопрос: как мне изменить это на таблицу данных ha sh или структуру данных ha sh, чтобы я мог оптимизировать поиск по определенному слову? Слово малого разговора является ключом, а ответом является значение.

smalltalk

int smalltalk(const char *intent)
{
// An array to store 9 smalltalk words
char *smalltalk[]= {"hi","hello","it","it's","that","that's","this","bye","goodbye"};

// Loop through the smalltalk array. Each index is a word.
for (int word = 0; word < 9; word++)
{
    // If user input matches a small talk word, return 1.
    if (strcmp(intent, smalltalk[word]) == 0)
    {
            return 1;
        }
    }

    return 0;

}
}

do_smalltalk

int do_smalltalk(int argc, char *argv[], char *response, int n)
{

    if (strcmp("hi",argv[0])==0  || strcmp("hello", argv[0]) == 0)
    {
        snprintf(response,n,"Hello");
    }
    else if (strcmp("it's",argv[0])==0 || strcmp("it",argv[0])==0)
    {
        snprintf(response,n,"Indeed it is.");
    }
    else if (strcmp("that's",argv[0])==0 || strcmp("that",argv[0])==0 || strcmp("this",argv[0])==0)
    {
        snprintf(response,n,"Yes, you're right.");
    }
    else if (strcmp("bye",argv[0])==0 || strcmp("goodbye",argv[0])==0)
    {
        snprintf(response,n,"Bye");
        return 1;
    }


    return 0;
}

1 Ответ

0 голосов
/ 05 апреля 2020

Я написал ваш код с помощью хеш-таблицы (алгоритм двойного хеширования), наслаждайтесь:

#include <stdio.h>
#include <stdint.h>
#include <string.h>

#define HTSZ 16 /* must be 2^N */
#define ROL(x, n) (x << n) | (x >> (32 - n))

/*----------------------------------------------------------------------*/
typedef struct {
  const char *str;
  int n;
} ht_entry;

ht_entry htab[HTSZ]; // Assume 0-filled

/*----------------------------------------------------------------------*/
ht_entry *ht_lookup(const char *s) {
  uint32_t pos = 0xdead, step = 0xbeef;
  for(const char *p = s; *p; p++) {
    pos = ROL(step, 3) + *p;
    step = ROL(pos, 5) ^ *p;
  }
  step |= 1; // Odd step in 2^n table
  ht_entry *rc;
  do 
    rc = htab + ((pos += step) & (HTSZ - 1));
  while(rc->str != NULL && strcmp(rc->str, s) != 0);
  return rc;
} // ht_lookup

/*----------------------------------------------------------------------*/
void ht_init() {
  // An array to store 9 smalltalk words
  char *smalltalk[]= {"hi","hello","it","it's","that","that's","this","bye","goodbye"};

  // Loop through the smalltalk array. Each index is a word.
  for (int word = 0; word < 9; word++) {
    ht_entry *e = ht_lookup(smalltalk[word]);
    e->str = smalltalk[word];
    e->n   = word;
  }
} // ht_init

int ht_search(const char *s) {
   *strchr(s, '\n') = 0; // Assume \n always presents
   ht_entry *e = ht_lookup(s);
   return e->str == NULL? -1 : e->n;
} // ht_search

/*----------------------------------------------------------------------*/
int main(int argc, char **argv) {
  ht_init();
  char word[100];
  for( ; ; ) {
    printf("\n> "); fflush(stdout);
    switch(ht_search(fgets(word, sizeof(word), stdin))) {
      case 0:
      case 1:
        printf("Hello!\n");
        break;
      case 2:
      case 3:
        printf("Indeed it is.\n");
        break;
      case 7:
      case 8:
        return 0;
      default:
        printf("What?!");
        break;
    } // switch
  } // for
  return 0;
} // main
...