Algorithm 优化Haskell中无限字符串的过滤
我正在解决HackerRank中的一个问题,在这个问题中,我必须计算无限重复序列的第一个Algorithm 优化Haskell中无限字符串的过滤,algorithm,performance,haskell,optimization,big-o,Algorithm,Performance,Haskell,Optimization,Big O,我正在解决HackerRank中的一个问题,在这个问题中,我必须计算无限重复序列的第一个n元素中'a'的字母数,例如“abc”的“abcabc…” 我使用列表理解实现了以下功能: repeatedString sn=length$[x | x您不需要显式计算as的数量。您可以做的是: 计算c中'a's的数量 检查s的完整循环次数(用n除以s的长度) 计算在s的最后一个(未完成)周期中发出的字符数 计算该部分中'a's的数量 将完整循环的'a's个数和不完整循环的'a's个数相加 因此,该程序看起
n
元素中'a'
的字母数,例如“abc”
的“abcabc…”
我使用列表理解实现了以下功能:
repeatedString sn=length$[x | x您不需要显式计算a
s的数量。您可以做的是:
计算c
中'a'
s的数量
检查s
的完整循环次数(用n
除以s
的长度)
计算在s
的最后一个(未完成)周期中发出的字符数
计算该部分中'a'
s的数量
将完整循环的'a'
s个数和不完整循环的'a'
s个数相加
因此,该程序看起来像:
repeatedString :: String -> Int -> Int
repeatedString s n = (length (filter ('a' ==) s) * div n (length s)) + …
使用…
处理最后一个(不完整)周期的部分,您仍然需要填写
即使n
很大,算法仍将在O(| s |)中运行。您不需要显式计算a
s的数量。您可以做的是:
计算c
中'a'
s的数量
检查s
的完整循环次数(用n
除以s
的长度)
计算在s
的最后一个(未完成)周期中发出的字符数
计算该部分中'a'
s的数量
将完整循环的'a'
s个数和不完整循环的'a'
s个数相加
因此,该程序看起来像:
repeatedString :: String -> Int -> Int
repeatedString s n = (length (filter ('a' ==) s) * div n (length s)) + …
使用…
处理最后一个(不完整)周期的部分,您仍然需要填写
即使n
很大,该算法仍将在O(| s |)中运行。我还没有看到这个问题,但我猜它包含一些非常大的n
。我认为你不能“直接”这样做方法更有效,但您可以简单地使用除法计算所需的s
的完整周期数,将其乘以s
中'a'
的数量,然后直接处理余数。只需计算字符串中a
的数量,然后检查该字符串将重复多少次你在n
中。是的,我曾考虑过这种方法,但不知道我的第一次拍摄是否还有其他原因。谢谢!@DavSanchez:但这是O(n)中的结果。如果n是巨大的,那么这将需要永远。没有太多的瓶颈,这只是一种“幼稚”我还没有看到这个问题,但我想它包含了一些非常大的n
值。我认为你不能“直接”这样做方法更有效,但您可以简单地使用除法计算所需的s
的完整周期数,将其乘以s
中'a'
的数量,然后直接处理余数。只需计算字符串中a
的数量,然后检查该字符串将重复多少次你在n
中。是的,我曾考虑过这种方法,但不知道我的第一次拍摄是否还有其他原因。谢谢!@DavSanchez:但这是在O(n)中运行的。如果n是巨大的,那么这将需要永远。没有太多的瓶颈,这只是一种“幼稚”的计算方法。