Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 优化Haskell中无限字符串的过滤_Algorithm_Performance_Haskell_Optimization_Big O - Fatal编程技术网

Algorithm 优化Haskell中无限字符串的过滤

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个数相加 因此,该程序看起

我正在解决HackerRank中的一个问题,在这个问题中,我必须计算无限重复序列的第一个
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是巨大的,那么这将需要永远。没有太多的瓶颈,这只是一种“幼稚”的计算方法。