这个怎么样:
令 L1 和 L2 是向量列表,其中 L1 是已访问/已处理的格向量列表,L2 是接下来要访问的向量列表。
- 设置 L₁={ } 和 L₂ = {[0]},其中 0 是零向量。
- 令 v 为 L₂ 中第一个列表的最小向量。
- 访问/处理向量 v。
- 将列表 L={v+e₁,...,v+e n } 添加到 L₂,以便列表按其最小元素排序。只生成 v+e i只要其范数小于您的预定义界限。
- 在 L1 的末尾插入 v 并将其从第一个列表 L2 的前面删除。
- 如果第一个列表现在为空,请将其从 L₂ 中删除。如果没有,请将其移动到正确的位置。
- 如果 L₂ 不为空,则转到 2。
该算法要求 e i按其范数从小到大排序。
该算法每轮最多将 n 个向量添加到 L₂。让 B 成为您预定义的上限,那么您将访问最多 n k -1 个向量,其中 k = 1+B/||e₁||。第一个约。n k'轮,列表大小为 n,其中 k' = B/||e n ||。所以总的来说,你必须存储少于 N = n k' + (n k -1)/(n k'+1 ) 个列表。您可以在 O(n) 中生成一个新列表并将其添加到 O(log N) 中的 L₂ 中(二进制搜索正确的位置并将其链接插入其中)。
所以总体复杂度大概是 O(N⋅n⋅log N),但请注意 N 是关于您要查找的向量的数量。
注意:很可能有更快的算法,但这是您可以尝试的。