小编Eri*_*ric的帖子

你何时会在BOYER-MOORE上使用KMP

我目前正在学习模式匹配算法,并且遇到了这两种算法.我有以下一般想法:

KMP

  • 从左到右比较文本
  • 使用故障数组智能地转换
  • 取O(m),其中m是模式的长度,以计算故障数组
  • 需要O(m),空间
  • 需要O(n),时间来搜索字符串

BM

  • 比较最后一个字符的模式
  • 使用糟糕的角色跳跃和良好的后缀跳跃
  • 采用O(m +字母表大小)来计算表格
  • 取O(m +字母大小),空格
  • 需要O(n),但通常更好搜索

我遇到了以下引发这个问题的问题(正确还是错误):

如果我们想要在许多不同的文本中重复搜索相同的模式,那么Knuth-Morris-Pratt(KMP)算法是一个很好的选择.

所以我认为答案是正确的,因为假设每次在不同文本上运行算法时,预处理只是O(n),对于BM,它是O(n +字母表大小).但是,我不确定我是否正在做出正确的假设,即每次重新运行算法时都会重新计算新表.因为说文字总是落在英文字母表中.我只需要计算一次表,只需重用表.那么在一天结束的时候,这个问题的答案是否依赖于这样的事实:算法都是在包含在同一字母表中的文本上运行,还是有一些其他可能影响它的因素?

algorithm pattern-matching boyer-moore knuth-morris-pratt

23
推荐指数
1
解决办法
1万
查看次数

如何向chart.js图添加工具提示

我正在开发一个webapp,最近我用谷歌图表和chart.js交换了谷歌图表,因为它在视觉上更具吸引力.然而,我所承受的一个损失是我不能再在数据点之上获得工具提示.我想知道是否有人知道如何做到这一点,因为我是一个新手javascript.以下是图表和设置的代码:

    var data = {
            labels : graphData[0],
            datasets : [
                {
                    fillColor : "rgba(200,160,100,0.5)",
                    strokeColor : "rgba(80,240,70,1)",
                    pointColor : "rgba(80,240,70,1)",
                    pointStrokeColor : "#fff",
                    data : graphData[3]
                },
                {
                    fillColor : "rgba(220,220,220,0.5)",
                    strokeColor : "rgba(220,220,220,1)",
                    pointColor : "rgba(220,220,220,1)",
                    pointStrokeColor : "#fff",
                    data : graphData[1]
                },
                {
                    fillColor : "rgba(151,187,205,0.5)",
                    strokeColor : "rgba(151,187,205,1)",
                    pointColor : "rgba(151,187,205,1)",
                    pointStrokeColor : "#fff",
                    data : graphData[2]
                }
            ]
        };

        var options = {
            scaleShowGridLines : true,
            scaleShowLabels : true,
            animationSteps : 150,
            scaleOverride: true,
            scaleSteps …
Run Code Online (Sandbox Code Playgroud)

javascript charts chart.js

19
推荐指数
3
解决办法
2万
查看次数

如何使三角代码更有效

我需要帮助才能使我的代码更有效率,并将其清理一下.

由于此所示的图像,X和Y可以围绕整个屏幕任何位置,我想找到的角度吨.有没有办法可以减少这里的行数?

注意:原点位于左上角,向右/向下移动正向移动

o := MiddleOfScreenX - x;
a := MiddleOfScreenY - y;

t := Abs(Degrees(ArcTan(o / a)));

if(x > MiddleOfScreenX)then
  begin
    if(y > MiddleOfScreenY)then
      t := 180 + t
    else
      t := 360 - t;
  end
else
  if(y > MiddleOfScreenY)then
    t := 180 - t;
Run Code Online (Sandbox Code Playgroud)

代码是pascal,但是其他语言中使用类似语法或c ++或java的答案也很好.

:= sets the variable to that value
Abs() result is the absolute of that value (removes negatives)
Degrees() converts from radians to degrees
ArcTan() returns the inverse tan
Run Code Online (Sandbox Code Playgroud)

c++ java pascal trigonometry

4
推荐指数
1
解决办法
360
查看次数