我正在尝试优化一个在JavaScript中进行字符串二分查找的函数。
二分查找需要知道关键字==
或<
中间值。
但是这要求在JavaScript中进行两次字符串比较,不像类似于C
语言中有strcmp()
函数,它返回三个值(-1, 0, +1)
表示(小于、等于、大于)。
是否有一种原生的JavaScript函数,可以返回三元值,从而在二分搜索的每次迭代中只需要进行一次比较?
我正在尝试优化一个在JavaScript中进行字符串二分查找的函数。
二分查找需要知道关键字==
或<
中间值。
但是这要求在JavaScript中进行两次字符串比较,不像类似于C
语言中有strcmp()
函数,它返回三个值(-1, 0, +1)
表示(小于、等于、大于)。
是否有一种原生的JavaScript函数,可以返回三元值,从而在二分搜索的每次迭代中只需要进行一次比较?
localeCompare()
方法。string_a.localeCompare(string_b);
/* Expected Returns:
0: exact match
-1: string_a < string_b
1: string_a > string_b
*/
在JavaScript中,您可以将两个字符串的值与整数进行比较,因此可以这样做:
"A" < "B"
"A" == "B"
"A" > "B"
因此,您可以创建自己的函数,以与 strcmp()
相同的方式检查字符串。
以下是执行相同操作的函数:
function strcmp(a, b)
{
return (a<b?-1:(a>b?1:0));
}
strcmp
函数可以定义为这样:function strcmp(a, b) {
if (a.toString() < b.toString()) return -1;
if (a.toString() > b.toString()) return 1;
return 0;
}
编辑 这里是一个字符串比较函数,最多只需要进行 min { length(a), length(b) } 次比较就可以确定两个字符串之间的关系:
function strcmp(a, b) {
a = a.toString(), b = b.toString();
for (var i=0,n=Math.max(a.length, b.length); i<n && a.charAt(i) === b.charAt(i); ++i);
if (i === n) return 0;
return a.charAt(i) > b.charAt(i) ? -1 : 1;
}
a.length
, b.length
}步骤(每次比较两个字符)才能确定字符串是否相等。(即使是localeCompare
也会在内部执行此操作。) - Gumbo
return str1 < str2 ? -1 : str1 > str2;
的翻译是:如果 str1 小于 str2,则返回-1,否则返回 str1 是否大于 str2。 - 1''strcmp
的问题,即使那个问题的答案是相同的,因为我认为并不是所有寻找答案的人都知道strcmp
。 - Dan Nissenbaum