数字比较比字符串比较快吗?

Fir*_*ame 20 c++ java computer-science

我听说哈希(即将字符串或对象转换为数字)用于字符串等,因为它比字符串更容易比较数字.如果是真的,这是什么原因?

小智 32

情况不一定如此,但大多数情况下可能就是这种情况.

考虑以下情况:

我想比较字符串"apples"和"oranges".如果我只想确定"apples"=="oranges",我只需要比较每个字符串的第一个字符:'a'!='o'=>"apples"!="oranges".如果我对字符串进行散列然后进行比较,那么它会慢得多,因为我必须解析两个字符串并在比较结果整数之前将它们提供给散列算法.

但是,如果我需要多次进行这种比较,也许我将"橘子"与"猩猩"进行了很多比较,那么如果我将所有字符串都哈希一次并对整数进行多次比较,那么它就会解决快点.这是哈希映射所基于的原则.

但是,请注意,散列字符串对于直接等于比较很有用,它无法确定字符串是否在词典上大于或小于彼此,因此无法通过散列方法排序字符串.(这就是为什么Java中的HashMap是无序的).

  • +1为这个问题带来有趣的方面 (4认同)

gob*_*ice 11

比较两个数字的速度比比较两个数字(表示相同的数字)要快.比较两个数字只需要比较各个比特,并且可以使用AND,XOR,2的补码等任何超快速完成.

比较两个字符串非常慢且昂贵.大多数算法需要遍历整个字符串并匹配每个字符.

例如,假设我们想要比较9和12(假).对于数值比较,我们假设算法比较单个位.9 = 1001 12 = 1100

这里,最坏情况算法将比较4位.

现在,如果我们将"9"和"12"表示为字符串,它们将以16位存储在内存中(回想一下:Java使用UTF-16表示内存中的字符串),并且必须传递给字符串比较算法.实际上,Java的实际String比较函数如下:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,String比较还有很多其他内容.