我正在寻找一些关于存储条纹图样数据库中所有可能的排列的建议.

所以15块瓷砖的问题有16块!可能的排列,但是存储fringe的值,因此0(空块)、3、7、11、12、13、14、15是16!/(16-8)!=518,918,400排列.

我希望将所有这些排列与启发式函数的值一起存储在数据 struct 中(每次广度第一次搜索的迭代都会递增),到目前为止,我正在这样做,但速度非常慢,我花了5分钟来存储60,000,这是我没有的时间!

Fringe Tiles

目前,我有一个这样的 struct .

Value Pos0 Pos3 Pos7 Pos11 Pos12 Pos13 Pos14 Pos15

在那里我存储给定数字的位置.我必须使用这些位置作为ID,因为当我计算启发式值时,我可以快速搜索到给定的构图并检索该值.

这一点我不太确定.拼图的状态由数组示例表示:

int[] goalState = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}

我的问题是,存储这些值的最佳数据 struct 是什么?也是找回它们的最好方法.

(这个问题最初是基于存储在数据库中的,但现在我想以某种形式的本地数据 struct 存储它们-因为从数据库检索很慢)

推荐答案

每个数字0-15是一个4位数字.您必须表示7个这样的数字,最低要求为28位,这完全在int的31个有符号位空间之内.因此,所有排列都可以分配给ANint并从ANint中导出.

要计算这个数字,给定变量ag:

int key = a | (b << 4) | (c << 8) | (d << 12) | (e << 16) | (f << 20) | (g << 24);

要解码(如果需要):

int a = key & 0xF;
int b = key & 0xF0;
int c = key & 0xF00; // etc

在数据库中存储ints非常高效,并且将使用最少的磁盘空间:

create table heuristics (
    key_value int not null,
    heuristic varchar(32) not null -- as small as you can, char(n) if all the same length
);

After插入所有行,创建一个covering index,用于超快速查找:

create unique index heuristics_covering heuristics(key_value, heuristic);

如果创建此索引before插入,插入将非常、非常慢.

创建数据并插入数据是相对简单的编码.

Database相关问答推荐

Kusto:从一个表中复制行并追加到同一集群中的另一个表中

如何以编程方式将产品添加到 Opencart 数据库

递归关系的数据库设计

如何将正在使用的数据库复制到django中的其他数据库?

执行次数最多的存储过程?

SQLite 如果列存在

ORM vs 传统数据库查询,它们的字段是什么?

Postgresql 从多个表中删除多行

从 XML 读取数据

MySQL JDBC Driver中cachePrepStmts和useServerPrepStmts有什么区别

如何关闭 Rails 中的updated_at列?

在 Slick 3 的事务中执行非数据库操作

多语言数据库,默认回退

你如何记录你的数据库 struct ?

如何在文件系统中存储图像

为什么负 id 或零被认为是不好的做法?

单元测试数据库

最小覆盖和功能依赖

如何修复 Postgres 上过时的 postmaster.pid 文件?

我将如何为读写操作实现单独的数据库?