algorithm - 如何一遍又一遍地在 {0,1,2}^12 中找到最近的向量

标签 algorithm math search dijkstra

我正在搜索长度为 12 的向量空间,条目为 0、1、2。例如,一个这样的向量是
001122001122。我有大约一千个好向量,大约一千个坏向量。对于每个坏向量,我需要找到最近的好向量。两个向量之间的距离就是不匹配的坐标数。好向量的排列不是特别好,它们“好”的原因在这里似乎没有帮助。我的首要任务是算法要快。

如果我进行简单的穷举搜索,我必须计算大约 1000*1000 个距离。这看起来很愚蠢。

如果我首先使用好的向量应用 Dijkstra 算法,我可以为空间中的每个向量计算最近的向量和最小距离,这样每个坏的向量都需要一个简单的查找。但是空间中有 3^12 = 531,441 个向量,所以预计算是 50 万个距离计算。没有多少积蓄。

你能帮我想个更好的办法吗?

编辑:由于人们认真地询问是什么让他们“好”:每个向量代表六个等边三角形的六边形图片的描述,这是立方体的 3D 排列的 2D 图像(想想广义 Q-bert)。等边三角形是立方体 (45-45-90) 面的一半,倾斜成透视图。其中六个坐标描述了三角形的性质(感知的地板、左墙、右墙),六个坐标描述了边的性质(感知的连续性,两种感知的不连续性)。 1000 个好的矢量是那些代表六边形的矢量,在透视立方体时可以看到这些六边形。搜索的原因是将局部校正应用于充满三角形的十六进制图...

最佳答案

为了让事情保持正确,并确保您没有优化不必要的事情,没有任何优化的蛮力方法在我的机器上需要 12 秒。

Mathematica 中的代码:

bad = Table[RandomInteger[5, 12], {1000}];
good = Table[RandomInteger[2, 12], {1000}];
distance[a_, b_] := Total[Sign@Abs[a - b]];

bestMatch = #[[2]] & /@ 
   Position[
    Table[Ordering@
      Table[distance[good[[j]], bad[[i]]], {j, Length@good}], {i, 
      Length@bad}], 1] // Timing

如您所料,时间遵循 O(n^2) 定律:

alt text

关于algorithm - 如何一遍又一遍地在 {0,1,2}^12 中找到最近的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4221712/

相关文章:

.net - 学习正则表达式模式的算法

javascript - AS3 - math.pow 和 math.log

java - 本应为正数的负数输出

java - 使用正则表达式拆分简单的数学表达式

Sharepoint 搜索不起作用

sql-server - 使用特定单词搜索表列

c# - 基于列比较的排序矩阵

python - 测试列表列表以根据约束删除不需要的列表

java - 链表 addToTail() 不工作

excel - 在另一张表中查找值以填充表格