Бинарный поиск массив числовых строк не находит значений - PullRequest
0 голосов
/ 21 февраля 2020

Я знаю, что есть тонна примеров бинарного поиска, но у меня возникают трудности с тем, чтобы заставить любой работать, когда у меня есть отсортированный массив нумерованных строк, например.

const sortedStringNumbers = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"];

Когда я подключаю его в функцию бинарного поиска, например:

function bsearch (Arr,value){
        var low  = 0 , high = Arr.length -1 ,mid ;      
        while (low <= high){
            mid = Math.floor((low+high)/2);     
            if(Arr[mid]==value) return true; 
            else if (Arr[mid]<value) low = mid+1;
            else high = mid-1;          
        }
        return -1 ;
    }

Когда я запускаю:

bsearch(sortedStringNumbers, '3')

, возвращается -1

Когда я запускаю :

bsearch(sortedStringNumbers, '26)

возвращает true;

Наконец, причина, по которой я просто не конвертирую входной массив двоичного поиска, заключается в том, что мне нужно использовать эту функцию для двух виды отсортированных массивов, вышеупомянутый вид и другие, содержащие слова, такие как: const sortedWordsArray = ['Algebra', 'Biology', 'Chemistry', ...]

Бинарный массив поиска работает для массивов слов, кстати.

1 Ответ

1 голос
/ 21 февраля 2020

Убедитесь, что ваш массив отсортирован.

Когда вы проводите сравнение

Arr[mid]<value

или

Arr[mid]==value

Они сравниваются как строки, а не как числовые значения c.

Если вы хотите, чтобы он работал в "обоих" сценариях ios, как вы и предлагали, вы можете попробовать что-то вроде

function bsearch (Arr,value){
        var low  = 0 , high = Arr.length -1 ,mid ;      
        while (low <= high){
            mid = Math.floor((low+high)/2);     

            var int_val = Arr[mid];
            if (!isNaN(Arr[mid])) {
                int_val = parseInt(Arr[mid]);
            }

            if(int_val==value) { 
                return true; 
            }
            else if (int_val<value) {
                low = mid+1;
            }
            else {
                high = mid-1;          
            }
        }
        return -1 ;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...