#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-разрядные переменные.