是否有有效实现此加密算法的数据结构?

Is there a data structure for effective implementation of this encryption algorithm?

输入 -> 字母表 -> 输出(字母表中数字的索引) -> 新字母表(移动到字母表开头的数字):

3 -> [1, 2, 3, 4, 5] -> 3 -> [3, 1, 2, 4, 5]

2 -> [3, 1, 2, 4, 5] -> 3 -> [2, 3, 1, 4, 5]

1 -> [2, 3, 1, 4, 5] -> 3 -> [1, 2, 3, 4, 5]

1 -> [1, 2, 3, 4, 5] -> 1 -> [1, 2, 3, 4, 5]

4 -> [1, 2, 3, 4, 5] -> 4 -> [4, 1, 2, 3, 5]

5 -> [4, 1, 2, 3, 5] -> 5 -> [5, 4, 1, 2, 3]

输入:(n - 字母表中数字的个数,m - 待加密文本的长度,文本)

5、6

3 2 1 1 4 5

答案:3 2 1 1 4 5 -> 3 3 3 1 4 5

是否有任何数据结构或算法可以比 O(n*m) 更高效、更快地执行此操作?

如有任何想法,我将不胜感激。谢谢。

也许是具有 letter/index 对的哈希图?我相信大多数时候哈希图中的元素查找通常是 O(1),除非你有很多冲突(这不太可能)。

使用 order statistics tree 存储对 (1,1)...(n,n),按第一个元素排序。

通过选择树中第 c 个最小的元素并取其第二个元素来查找字符 c 的翻译。

然后通过删除您查找的节点并将其插入树中来更新树,并将该对的第一个元素设置为 -t,其中 t 是在消息(或其他稳步递减的计数器)。

如果使用自平衡搜索树(例如 red-black tree)作为订单统计树的底层树结构,则查找、删除和插入可以在 O(ln n) 时间最坏情况下完成.

鉴于初始树的元素是按顺序插入的,因此可以在O(n)中构建树结构。

所以整个算法将是 O(n + m ln n) 时间,最坏情况。


对于 n 大于 m 的情况,您可以进一步改进这一点,方法是只为树中任何连续范围的节点存储一个节点,但为了根据节点数在顺序统计树中排名通常

然后只从一个实际存储的节点开始,当重新排列树时,你将表示范围的节点分成三个:一个节点代表找到值之前的范围,一个代表找到值之后的范围,一个节点代表找到值之后的范围。代表实际价值。然后将这三个节点插回,在范围节点的情况下,仅当它们非空且第一对元素等于第二对元素时,在非范围节点的情况下,如前所述具有负值。如果找到第一个条目为负的节点,则不在此拆分。

结果是树最多包含 O(m) 个节点,因此该算法的最坏时间复杂度为 O(m ln min(n,m)).