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

#c #hashtable

#c #хэш-таблица

Вопрос:

Я пытаюсь улучшить код, включающий последовательность collatz. Точнее, число менее 1 миллиона, которое производит самую большую последовательность Коллатца. Я должен реализовать хэш-таблицу, чтобы улучшить тривиальное решение. Проблема в том, что мое решение занимает в основном то же время, что и прямой подход. Я никогда раньше не создавал код со структурой данных. Я делаю что-то не так? Как я могу это улучшить? Я больше не знаю, что делать.

Мой код ниже:

 #include lt;stdio.hgt; #include lt;time.hgt;   #define N 1000000  int hash (int x){  return (x % N); }  void hash_insert(int v[], int x){  v[hash(x)] = x; }  int search(int v[], int x){  int k;  k = hash(x);  if(v[k] == x){  return k;  } else{  return -1;  } }  int seq(int v[], int index){  unsigned int x;  int count = 1;  x = search(v, index);    while(x gt; 1){  if(x%2 == 0){  x = x/2;  }else {  x= x*3   1;  }    count  ;  }   return count; }  int main(){  int v[N];  int i;  int n;  int numbers;  int temp;    clock_t tic = clock();  for(i=0; ilt;N; i  ){  hash_insert(v, i);  numbers = seq(v, i);    if(numbers gt; temp){  temp = numbers;  n = i;   }  }    clock_t toc = clock();  printf("Number which produces the largest sequence: %d with %d elements", n, temp);  printf("nElapsed: %f secondsn", (double)(toc - tic) / CLOCKS_PER_SEC);    return 0; }  

Комментарии:

1. Я предлагаю сделать int v[N]; либо глобальный, либо статический. В противном случае стек может быть легко исчерпан

2. Можете ли вы описать, что делает ваш код и как, по вашему мнению, использование хэш-таблицы улучшает его?

3. обратите внимание, что самый длинный элемент последовательности Collatz для числа меньше 1e6 может быть больше миллиона. В таком случае программа переполнит массив и выйдет из строя (если вам повезет).

4. Некоторые из проблем: v никогда не инициализируется, вы никогда не сохраняете в нем вычисленные результаты и неправильно обрабатываете результат поиска при проверке того, был ли результат уже вычислен.

5. Вам не нужна хэш-таблица для вычисления последовательностей до 1000000. Вам действительно нужно использовать 64-разрядные переменные.