在 JavaScript 中比较字符串的最佳方法?

IT技术 javascript string optimization comparison binary-search
2021-01-29 07:54:32

我正在尝试优化一个在 JavaScript 中对字符串进行二进制搜索的函数。

二分查找要求您知道键是==枢轴还是<枢轴。

但这需要 JavaScript 中的两个字符串比较,这与C具有strcmp()返回三个值(-1, 0, +1)(小于、等于、大于)函数的语言不同

JavaScript 中是否有这样一个本机函数,它可以返回一个三元值,以便在二分搜索的每次迭代中只需要进行一次比较?

3个回答

您可以使用该localeCompare()方法。

string_a.localeCompare(string_b);

/* Expected Returns:

 0:  exact match

-1:  string_a < string_b

 1:  string_a > string_b

 */

进一步阅读:

显然你最好自己比较一下;jsperf.com/localecompare
2021-03-15 07:54:32
@GerbenJacobs 谢谢。我还从中得出了一个更大的基准(二进制搜索):jsperf.com/localecompare/2
2021-03-16 07:54:32
当您需要不区分大小写的比较时,您可以使用 toLowerCase 或 toLocaleLowerCase。
2021-03-20 07:54:32
不幸的是, stringCompare 并不可靠。Opera、IE、Firefox、Chrome 和 Safari 都为 'dog'.localeCompare('cat') 返回 1,这是意料之中的,当您反转调用者和参数时,返回 -1。但是大写字母的行为很奇怪 - 'dog'.localeCompare('Dog') 在我测试的浏览器中,只有 Safar 4 返回 1。它在 IE8 和 firefox 3 中返回 -1,Opera 9 和 Chrome 都返回 +32。
2021-03-23 07:54:32
我认为重要的是要注意 V8 (Chrome) 在 localeCompare 上似乎对 ECMA-262 的解释与 IE/Firefox 不同。例如:"a".localeCompare("Z") 应该返回 -1 而是返回 7,它是 "a" 的字符代码 - "Z" 的字符代码。不幸的是,规范中的语言很松散,指定 localeCompare() 返回负数、正数或 0。(不是特别是 -1, 1, 0)。我提交了一个错误报告,希望这可能会改变,但它自 2010 年 8 月以来一直是一个问题,所以我怀疑它会不会。
2021-04-10 07:54:32

那么在 JavaScript 中,您可以检查两个字符串的值是否与整数相同,因此您可以这样做:

  • "A" < "B"
  • "A" == "B"
  • "A" > "B"

因此,您可以创建自己的函数,以与strcmp().

所以这将是执行相同操作的函数:

function strcmp(a, b)
{   
    return (a<b?-1:(a>b?1:0));  
}
再次,阅读原始问题!关键是要避免进行多个字符串比较。
2021-03-27 07:54:32
哦对不起。没有看到......至少这对某人有用。=|
2021-03-27 07:54:32

您可以使用比较运算符来比较字符串一个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;
}
@Pointy:但是减法是逐个字符完成的。这就是重点。最多需要(至少像我写的那样) min { a.length, b.length} 步骤(在两个字符串相等的情况下)。但你是对的。最好先测试相等性,因为这需要最多的步骤。
2021-03-21 07:54:32
@Gumbo localeCompare 不必在 Javascript 中,对吗?它可以在本地实现。或者我错过了什么......
2021-03-22 07:54:32
@Pointy:仅进行一项比较是不可能的。您至少需要 min { a.length, b.length} 步骤(一次比较两个字符)来确定字符串是否相等。(甚至localeCompare会在内部这样做。)
2021-03-23 07:54:32
但是这个例程正是 OP 不想做的:有两个字符串比较(更不用说那些对“toString”的函数调用了)。
2021-03-26 07:54:32
不,localeCompare 不会在内部执行此操作。比较字符是作为减法实现的,因此只要该操作的结果为非零,您就知道答案。您的答案可能会重新比较每个字符串的所有字符。
2021-03-28 07:54:32