Зачем использовать дозорный сигнал в последовательном поиске? [Дубликат]

// Store integer 182
int intValue = 182;
// Convert integer 182 as a hex in a string variable
string hexValue = intValue.ToString("X");
// Convert the hex string back to the number
int intAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

из http://www.geekpedia.com/KB8_How-do-I-convert-from-decimal-to-hex-and-hex-to-decimal.html

-1
задан 25 October 2015 в 12:59
поделиться

5 ответов

Если вы добавите значение для поиска, вы можете уменьшить одно сравнение в каждом цикле, чтобы сократить время работы. Это может выглядеть как (i = 0 ;; i ++), если (array [i] == elementToSearch) возвращает i;.

1
ответ дан blitz 20 August 2018 в 08:33
поделиться

Дело в том, что вы можете преобразовать цикл for в цикл while / repeat. Обратите внимание, как вы проверяете i & lt; длина каждый раз. Если вы его скрываете,

do {
} while (array[i++] != elementToSearch);

Тогда вам не нужно делать дополнительную проверку. (в этом случае array.length теперь больше)

1
ответ дан Ha. 20 August 2018 в 08:33
поделиться

Стандартный линейный поиск будет проходить через все элементы, проверяющие индекс массива каждый раз, чтобы проверить, когда он достиг последнего элемента. Как и ваш код.

for (int i = 0; i < length; i++) {
    if (array[i] == elementToSearch) {
        return i; // I found the position of the element requested
    }
}

Но идея - поисковый запрос - это сохранить элемент в поиске в конце и пропустить поиск индекса массива, это уменьшит одно сравнение в каждая итерация.

while(a[i] != element)
    i++;
2
ответ дан Haris 20 August 2018 в 08:33
поделиться

Если вы добавляете значение для поиска в конце массива, то вместо использования цикла for с инициализацией, условием и приращением вы можете использовать более простой цикл, например

while (array[i++] != ementToSearch)
    ;

. Затем условие цикла является проверкой значения, которое вы ищете, что означает, что меньше кода для выполнения внутри цикла.

1
ответ дан Some programmer dude 20 August 2018 в 08:33
поделиться

Использование значения sentinel позволяет удалить переменную i и, соответственно, ее проверку и увеличение.

В вашем линейном поиске цикл выглядит следующим образом

for (int i = 0; i < length; i++) {
    if (array[i] == elementToSearch) {
        return i; // I found the position of the element requested
    }
}

Таким образом, переменная i является введенный, инициализированный, сравниваемый на каждой итерации цикла, увеличенный и используемый для вычисления следующего элемента в массиве.

Также функция фактически имеет три параметра, если перейти к функции по искомому значению

int linearSearch(int array[], int length, int value) {
//...

Используя значение дозорной функции, эту функцию можно переписать следующим образом

int * linearSearch( int array[], int value ) 
{
    while ( *array != value ) ++array;

    return array;
}

. И внутри вызывающего абонента вы можете проверить, имеет ли массив значение следующим образом

int *target = linearSearch( array, value );

int index = target == array + size - 1 ? -1 : target - array; 
1
ответ дан Vlad from Moscow 20 August 2018 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: