Algorithm 是否有一个数据结构可以有效地实现此加密算法?

Algorithm 是否有一个数据结构可以有效地实现此加密算法?,algorithm,encryption,language-agnostic,Algorithm,Encryption,Language Agnostic,输入->字母表->输出(字母表中数字的索引)->新字母表(移动到字母表开头的数字): 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,4,1,2,3] 输入:(n-字母表中的数字数,m-要加密的文本长

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

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,4,1,2,3]

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

5,6

3 2 1 4 5

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

是否有任何数据结构或算法可以使其比O(n*m)更高效、更快


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

也许是一个包含字母/索引对的哈希映射?我相信hashmap中的元素查找在大多数情况下通常是O(1),除非有很多冲突(这是不可能的)。

使用一个存储对
(1,1)…(n,n)
,按它们的第一个元素排序

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

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

如果使用自平衡搜索树(例如a)作为订单统计树的基础树结构,则可在时间最坏情况下进行查找、删除和插入

假设初始树的元素是按顺序插入的,那么可以在
O(n)
中构建树结构

因此,整个算法将是
O(n+mlnn)
时间,最坏情况


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

然后,从仅一个实际存储的节点开始,重新排列树时,将表示节点的范围拆分为三个:一个节点表示查找到的值之前的范围,一个节点表示查找到的值之后的范围,另一个节点表示实际值。然后,对于范围节点,仅当这三个节点为非空且第一对元素等于第二对元素时,才将这三个节点插回;对于非范围节点,如前所述,这三个节点的值为负值。如果找到第一个条目为负的节点,则不会在此节点中拆分该节点


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

这没有帮助,因为需要为消息中的每个字符修改映射。但是如果我们将元素对中的第一个元素设置为-t,则下次如何查找此元素?@OliverWayne您永远不会通过搜索第一个元素来进行查找。而是在树中搜索排名。值是否为
-t
,实际上也无关紧要。您只需要在树中的所有其他元素之前插入该元素。如果您自己实现了这一点,就可以完全删除第一个元素,因为插入保证只在开始时发生。