короче ... ЛОР-овские анонимусы подтверждают свой высокий статус и что они круче гор
... написал я реализацию на C ... честно признаюсь, тупо переписывал код с явы, в качестве реализации hash таблицы использовалась реализация найденая в гугле
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "hashtable.h"
typedef __int64 desk_t;
int desk_size = 8;
char verts[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
char diags1[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
char diags2[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
unsigned solution_count = 0;
desk_t desk_cache[23000000];
int desk_cache_count = 0;
struct hsahtable* desk_hash = NULL;
desk_t desk_set_pos(desk_t desk, int c, int r)
{
return desk | ((__int64)c << (r * 4));
}
unsigned int desk_hash_from_key( void *k )
{
return *(unsigned int*)k;
}
int desk_keys_equal ( void *key1, void *key2 )
{
return *(desk_t*)key1 == *(desk_t*)key2;
}
void desk_save_cache(desk_t desk)
{
if (desk_cache_count >= 23000000)
{
printf("\nalarm, desk_cache_count >= 23000000!!!\n");
exit(1);
}
desk_cache[desk_cache_count] = desk;
hashtable_insert(desk_hash, &desk_cache[desk_cache_count], (void*)1);
desk_cache_count++;
}
char desk_in_cache(desk_t desk)
{
return hashtable_search(desk_hash, &desk) != NULL;
}
void desk_clone(desk_t desk, desk_t* rotate, desk_t* fliphor, desk_t* flipvert)
{
int col = 0;
int row;
*rotate = *fliphor = *flipvert = 0;
for (row = 0; row < desk_size; row++)
{
col = (desk >> (row * 4)) & 0xf;
*rotate = desk_set_pos(*rotate, row, desk_size - col - 1);
*fliphor = desk_set_pos(*fliphor, desk_size - col - 1, row);
*flipvert = desk_set_pos(*flipvert, col, desk_size - row - 1);
}
}
void desk_print(desk_t desk)
{
int row;
for (row = 0; row < desk_size; row++)
{
int col = (int)((desk >> (row * 4)) & 0xf);
int i = 0;
for (i = 0; i < col; i++)
printf(".");
printf(";");
i++;
for (;i < desk_size; i++)
printf(".");
printf("\n");
}
}
void solve(desk_t desk, int row)
{
int col;
desk_t clone;
desk_t _clone;
desk_t fliphor;
desk_t flipvert;
int i;
if (row == desk_size)
{
if (!desk_in_cache(desk))
{
solution_count++;
if (!(solution_count % 1000))
printf("\r%d", solution_count);
desk_clone(desk, &clone, &fliphor, &flipvert);
clone = desk;
for(i=0;i<3;i++) {
desk_save_cache(clone);
desk_save_cache(fliphor);
desk_save_cache(flipvert);
_clone = clone;
desk_clone(_clone, &clone, &fliphor, &flipvert);
}
desk_save_cache(clone);
desk_save_cache(fliphor);
desk_save_cache(flipvert);
}
} else
{
for (col = 0; col < desk_size; col++)
{
if (!verts[col] && !diags1[row - col + (desk_size - 1)] && !diags2[row + col])
{
verts[col] = diags1[row - col + (desk_size - 1)] = diags2[row + col] = 1;
solve(desk_set_pos(desk, col, row), row + 1);
verts[col] = diags1[row - col + (desk_size - 1)] = diags2[row + col] = 0;
}
}
}
}
int main(int argc, char* argv[])
{
__time64_t start_time;
if (argc != 2)
{
printf("Usage: aqueens <desk size>\n");
return 1;
}
desk_size = atoi(argv[1]);
if (desk_size <= 0 || desk_size > 16)
{
printf("invalid desk size\n");
return 1;
}
// desk_hash = create_hashtable(2000000, desk_hash_from_key, desk_keys_equal);
desk_hash = create_hashtable(2850000, desk_hash_from_key, desk_keys_equal);
start_time = _time64(NULL);
solve(0, 0);
printf("\ntotal solutions %d in %d seconds.\n", solution_count, _time64(NULL) - start_time);
// printf("desk_cache_count = %d \n", desk_cache_count);
return 0;
}
результат запуска на компьютере с процессором Intel Core 2 Duo 2,6 Ггц, 4 Гбайт памяти, ОС Виста, транслировалось Microsoft Vidual studio 2005 SP1
итого монжо заключить что однопоточная сишная реализация работает быстрее чем многопоточная реализация на яве, использует меньше памяти, а также имеет более короткий исходный текст ... собственно многопоточную реализацию мобыть ещё осилю ... ну и оптимизации различные конечно можно проводить, собственно пока код без оптимизаций, тупо переписывание ...