问题列表 - 第30080页

什么是最快的子串搜索算法?

好吧,所以我听起来不像白痴我会更明确地陈述问题/要求:

  • 针(模式)和haystack(要搜索的文本)都是C样式的以空字符结尾的字符串.没有提供长度信息; 如果需要,必须计算.
  • 函数应该返回指向第一个匹配的指针,或者NULL如果找不到匹配项.
  • 不允许发生失败案件.这意味着任何具有非常量(或大常量)存储要求的算法都需要具有分配失败的后备情况(并且后备保养中的性能因此导致最坏情况的性能).
  • 实现是在C中,虽然没有代码的算法(或链接到这样的)的良好描述也很好.

......以及"最快"的意思:

  • 确定性O(n)where n= haystack长度.(但是O(nm)如果它们与更强大的算法组合以给出确定性O(n)结果,则可以使用通常(例如滚动哈希)算法的思想.
  • 从不执行(可测量;一些时钟if (!needle[1])等等)比天真蛮力算法更糟糕,特别是在非常短的针上,这可能是最常见的情况.(无条件的重预处理开销是不好的,因为试图以可能的针头为代价来改善病理针的线性系数.)
  • 给定任意针和干草堆,与任何其他广泛实现的算法相比,具有相当或更好的性能(不低于搜索时间长50%).
  • 除了这些条件,我将保留"最快"开放式的定义.一个好的答案应该解释为什么你认为你建议"最快"的方法.

我目前的实现比glibc实现的双向大约慢10%和8倍(取决于输入).

更新:我目前的最佳算法如下:

  • 对于长度为1的针,请使用strchr.
  • 对于长度为2-4的针,使用机器字一次比较2-4个字节,如下所示:在每次迭代时从大海捞针以16位或32位整数预加载针,并从大海捞针中循环旧字节输出/新字节.大海捞针的每个字节都只读取一次,并对0(字符串结束)和一个16位或32位比较进行检查.
  • 对于长度> 4的针,使用具有错误移位表的双向算法(如Boyer-Moore),该移位表仅应用于窗口的最后一个字节.为了避免初始化1kb表的开销,这对于许多中等长度的针来说是一个净损失,我保留一个位数组(32字节)标记移位表中的哪些条目被初始化.未设置的位对应于从不出现在针中的字节值,可以进行全针长度移位.

我脑海中留下的重大问题是:

  • 有没有办法更好地利用坏班次表?Boyer-Moore通过向后扫描(从右到左)充分利用它,但是双向扫描需要从左到右扫描.
  • 我在一般情况下找到的唯一两个可行的候选算法(没有内存或二次性能条件)是有序字母表上的双向字符串匹配.但是,是否存在易于检测的情况,其中不同的算法将是最佳的?当然,空间算法中的许多O(m)(其中m是针长)可以用于m<100左右.如果针对针的简单测试可能仅需要线性时间,那么也可以使用最坏情况二次方的算法.

奖励积分:

  • 假设针和干草堆都是结构良好的UTF-8,你能提高性能吗?(对于字节长度不同的字符,良好的形式在针和haystack之间强加了一些字符串对齐要求,并且当遇到不匹配的头字节时允许自动2-4字节移位.但这些约束是否会超出你的范围最大后缀计算,良好的后缀转换等已经为您提供了各种算法?)

注意:我很清楚那里的大多数算法,而不是它们在实践中的表现.这是一个很好的参考,所以人们不会继续给我作为评论/答案的算法参考:http://www-igm.univ-mlv.fr/~lecroq/string/index.html

c string algorithm substring

159
推荐指数
6
解决办法
7万
查看次数

如何根据R中的条件绘制不同的标记('x'和'o')

我有一个看起来像这样的数据:

for_y_axis <-c(0.49534,0.80796,0.93970,0.99998)
for_x_axis <-c(1,2,3,4)
count      <-c(0,33,0,4)
Run Code Online (Sandbox Code Playgroud)

我想要做的是使用for_x_axis和绘制图形,for_y_axis 但如果count值等于0(零)则用"o"标记点,如果值大于零则标记"x" count.

有没有一种简单的方法来实现R?

unix linux statistics r

2
推荐指数
1
解决办法
2114
查看次数

如何设置Rails验证以确保两个属性不能具有相同的值?

我的网站上有一个表单,允许用户在其他用户处发送消息,但我想确保他们不能自己定向消息.

该类具有属性:username和:target_user,我只想设置一个验证,检查以确保在保存任何内容之前这些属性不能具有相同的值.

我认为它看起来像这样:

validates_presence_of :user_id, :username, :target_user, :message, :tag

validate :username != :target_user
Run Code Online (Sandbox Code Playgroud)

但显然不知道Ruby能够正确地做到这一点.

validation ruby-on-rails

2
推荐指数
1
解决办法
1349
查看次数

为什么Ricart-Agrawala算法无死锁?

有人能解释为什么这个算法没有特别的死锁吗?谢谢

algorithm distributed deadlock

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

Android SDK与Adobe AIR:优点和缺点?

有人在博客上写过这个比较,还是有人想在这里试一试?很高兴看到关于Android上的Adobe AIR与"原生"Android SDK(Java)的一些合理的想法.

编辑:尽管观点很少,但没有答案,我在这里留下这个问题,因为它是一个需要在某个时候被覆盖的话题......但如果它没有引起注意,我会在几天后删除它.

air android

9
推荐指数
3
解决办法
5261
查看次数

2
推荐指数
1
解决办法
2651
查看次数

将嵌套的for循环转换为单个LINQ语句

有人可以帮我把这个嵌套结构变成一个LINQ语句吗?

        EventLog[] logs = EventLog.GetEventLogs();
        for (int i = 0; i < logs.Length; i++)
        {
            if (logs[i].LogDisplayName.Equals("AAA"))
            {
                for (int j = 0; j < logs[i].Entries.Count; j++)
                {
                    if (logs[i].Entries[j].Source.Equals("BBB"))
                    {
                        remoteAccessLogs.Add(logs[i].Entries[j]);
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

c# linq iteration syntax structure

11
推荐指数
1
解决办法
7377
查看次数

无法修改全局int,但可以修改列表.怎么样?

LISTL = [] VAR1 = 0 def foo():... VAR1 + = 1 ...返回VAR1 ...

在调用时foo(),我收到此错误:

UnboundLocalError: local variable 'VAR1' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

但是,请考虑清单 LISTL

>>> def foo(x):
...     LISTL.append(x)
...     return LISTL
... 
>>> foo(5)
[5]
Run Code Online (Sandbox Code Playgroud)

这按预期工作.问题是为什么列表中的追加有效,但我无法更改int?

另外,这是在Python中声明全局的正确方法吗?(在导入声明之后)

python

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

CSS Overflow属性无法在iPad中运行

我正在为iPad设计一些html页面.尝试css溢出属性,如yscroll,auto.滚动条没有出现在iPad中,也没有滚动的内容.我试过在ipad模拟器和设备中.有没有其他方法来实现这个属性.请帮帮我.提前致谢

css ipad

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

MySQL中JOIN和OUTER JOIN的区别

结果有什么不同:

  1. 正确的加入和正确的外部联接
  2. LEFT JOIN和LEFT OUTER JOIN?

你能通过一些例子解释一下吗?

sql join left-join outer-join right-join

87
推荐指数
4
解决办法
9万
查看次数