Оптимальный способ сравнения строк в JavaScript?

Я пытаюсь оптимизировать функцию, которая выполняет бинарный поиск строк в 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

 */

Дальнейшее чтение:

Ну, в 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;
}
Другие вопросы по тегам