我想检测循环缓冲区是否是相同长度的其他缓冲区列表的镜像或旋转。
例如,给出以下3个缓冲区:
AAABCCCA
AABCCBAA
AAAACCAA
然后:
CCBAAAAC
将匹配,因为它是第一个缓冲区的镜像旋转。
目前我只是比较每次旋转中的每个缓冲区,然后反转缓冲区并再次完成所有操作。
这需要:
2*n*i
缓冲区比较。
(其中n是要比较两个的缓冲区数,i是缓冲区的长度)。
有谁知道更快的算法?
要比较的列表会增长(因为我发现一个不在我所拥有的列表中)。有没有一种方法,我可以以某种方式'订购'缓冲区,以便比较可以更快地完成?
我的一个想法是还存储每个缓冲区的排序版本,以便您可以快速比较是否存在相同数量的项目。
但是,通过'循环序列'以某种方式排序还有更一般的解决方案吗?
答案 0 :(得分:3)
对于每个缓冲区,您可以旋转它直到它具有最小的词典值。
例如,您的示例缓冲区可以像这样旋转:
AAABCCCA -> AAAABCCC
AABCCBAA -> AAAABCCB
AAAACCAA -> AAAAAACC
这基本上意味着将最低价值的物品放在第一位。如果存在平局,则比较下一个项目等。这为任何模式提供了唯一的排序。