是否有有效实现此加密算法的数据结构?
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))
.
输入 -> 字母表 -> 输出(字母表中数字的索引) -> 新字母表(移动到字母表开头的数字):
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))
.