字符串比较时间复杂度

时间:2016-05-24 16:51:44

标签: string comparison time-complexity

哪种比较需要更长的时间?

a = helloworldhelloworldhelloworld
b = https://www.somerandomurls.com/directory/anotherdirectory/helloworld.html
if a != b: doThis()

a=one, b=two
if a != b: doThis()

我经常需要针对具有数千行的数据库进行检查。我不是在寻找任何特定的编程语言。我只是想知道哪个比较更快。如您所见,b的值在第一个示例中是较长的字符串,在第二个示例中较短。所以我想知道这对比较是否有任何影响。

2 个答案:

答案 0 :(得分:5)

字符串比较的时间为O(n),n为字符串的长度。

但是,根据测试数据,您可以手动优化匹配算法。我已经提到了一些。

优化1:

检查两个字符串的大小,如果不相等,则返回false。因为这将停止进一步的O(n)比较,并节省时间。通常,字符串数据结构将大小存储在内存中,而不是每次都进行计算。这使O(1)可以访问字符串大小。

实际上,这是一个巨大的优化。我将通过计算摊销时间复杂度来说明如何实现。

如果您的字符串数据结构可以包含最大大小为x的字符串,那么总共可能存在(x + 1)个可能的字符串大小(0、1、2,..., x)。

有两种选择(x + 1)选择2 的方式= x *(x + 1)/ 2

如果使用优化1,则仅在两个字符串长度相等时才需要比较整个长度。只有 x + 1 这种情况。完成的操作数将为 0 +1 + 2 + .... + x = x *(x +1)/ 2

剩余的(x + 1)*(x-2)/ 2 个案例将以O(1)时间计算。

因此总计算= x *(x + 1)/ 2 +(x + 1)*(x-2)/ 2 =(x + 1)*(x-1)其中是O(n ^ 2)。由于我们正在进行x *(x + 1)/ 2个字符串比较,因此每个比较的摊销时间复杂度为O(1)

如果没有任何优化,就会有

0 +1 *(x)* 1 + 2 *(x-1)* 2 + 3 *(x-3)* 3 + .... + x / 2 * x / 2 * x / 2 计算。毫无疑问,这将超过O(n ^ 3)。并且摊销时间复杂度将超过O(n)

优化2:

由于您的数据库包含Web链接,因此它们可能属于同一网站,因此前几个字符将始终相同。这将导致多余的CPU时间使用。因此,最好从这种情况下从末尾检查,因为相对链接只会与末尾不同。

注意 从理论上讲,我们没有开发一种可以改变最坏情况下时间复杂度的算法,它仍然是O(n)。我们只是在优化算法。

答案 1 :(得分:1)

字符串比较通常对字符进行线性扫描,在字符不匹配的第一个索引处返回false。

时间复杂度为O(N),实际所用时间取决于在统计出现差异之前需要扫描的字符数。如果每个字符串都以http://开头,那么扫描前7个字符将会有一个不变的开销(不需要根据您的专业数据定制比较算法)。

如果您有长字符串,许多字符串的开头倾向于具有相同的起始字符,并且极端性能要求您可以考虑散列字符串,首先比较散列,并且仅对字符串进行线性比较哈希匹配(以排除哈希冲突的可能性)。如果使用比假定的长字符串短的哈希值进行初始比较,则可以通过仔细设计查询策略来降低系统的IO和RAM要求。

相关问题