String 字符串比较时间复杂度

String 字符串比较时间复杂度,string,comparison,time-complexity,String,Comparison,Time Complexity,哪种比较需要更长的时间 a=helloworldhelloworldhelloworld b=https://www.somerandomurls.com/directory/anotherdirectory/helloworld.html 如果是b: doThis() 对 a=1,b=2 如果是b: doThis() 我经常需要检查我的数据库,它有数千行。我不寻找任何特定的编程语言。我只想知道哪个比较需要更快的时间。如您所见,b的值在第一个示例中是更长的字符串,在第二个示例中是更短的字符串。因

哪种比较需要更长的时间

a=helloworldhelloworldhelloworld

b=https://www.somerandomurls.com/directory/anotherdirectory/helloworld.html

如果是b:
doThis()

a=1,b=2

如果是b:
doThis()


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

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

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


如果你有长字符串,很多字符串的开头都有相同的起始字符和极端性能要求,你可以考虑散列字符串,先比较散列,然后只在哈希匹配的情况下对字符串进行线性比较(以排除哈希冲突的可能性)。如果使用比假定的长字符串短的散列进行初始比较,则可以通过仔细设计查询策略来降低系统的IO和RAM要求。

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

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


如果你有长字符串,很多字符串的开头都有相同的起始字符和极端性能要求,你可以考虑散列字符串,先比较散列,然后只在哈希匹配的情况下对字符串进行线性比较(以排除哈希冲突的可能性)。如果您使用比假定的长字符串短的哈希值进行初始比较,则可以通过仔细设计查询策略来降低系统的IO和RAM要求。

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

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

优化1:

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

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

如果您的字符串数据结构可以有一个最大大小为x的字符串,那么总共可以有(x+1)个可能的字符串大小(0,1,2,…,x)

(x+1)选择两种方法选择两个字符串=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)。我们正在优化算法。

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

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

优化1:

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

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

如果您的字符串数据结构可以有一个最大大小为x的字符串,那么总共可以有(x+1)个可能的字符串大小(0,1,2,…,x)

(x+1)选择2