Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП Технология программирования.doc
Скачиваний:
20
Добавлен:
11.06.2015
Размер:
1.69 Mб
Скачать

Типичные задачи с массивами: поиск. Двоичный поиск в упорядоченном массиве

Поиск в массиве – очень часто возникающая задача. Она состоит в том, что по заданному значению нужно определить, содержится ли в массиве такое значение, и если да, то выдать его индекс. Простейшее решение для числовых массивов даёт следующая функция

function find(X, A) //Поиск Х в массиве А

{for (var i=0; i<A.length; i++)

if (X==A[i])

return i;

return -1

}

Эта функция выдаёт –1, если Х не входит в массив А. Выдавать false, null или undefined нельзя, так как при проверке результата они могут автоматически приводиться к 0 – индексу первого элемента. Среднее время поиска пропорционально длине массива, что очень много. Это заставляет искать более эффективные методы. Один из самых быстрых методов поиска – это двоичный поиск в упорядоченном массиве (т.е. в массиве, предварительно отсортированном и затем поддерживаемом в таком состоянии).

Двоичный поиск в упорядоченном массиве осуществляется посредством последовательного уменьшения области поиска делением её пополам. Отсюда и произошло название метода.

function binaryFind(X,A)

{var a=0; //Левый конец области поиска

var b=m.length-1; //Правый конец области поиска

var с; //Середина области поиска

do

{c=Math.floor((a+b)/2); //Середина

if (A[c] < X) //Х должен быть в правой половине

a=c+1 //Выбираем правую половину

else

b=c-1 //Выбираем левую половину

}

while (A[c]!=X && a<=b);

//Из цикла выйдем, когда найдём Х==A[c], или

//когда область поиска станет пустой (a>b)

if (a>b)

return -1 //Массив не содержит X

else

return c //Индекс Х

}

Время поиска для этого алгоритма всегда меньше двоичного логарифма от длины массива, или десятичного логарифма от длины массива, умноженного на 10/3. Так что поиск в массиве из 1 000 000 элементов потребует не более 20 шагов цикла. Это в 25 000 раз быстрее предыдущего алгоритма.

Обработка строк. Конструкторы, свойства, методы строк

Объекты типа String обладают свойствами и методами для обработки строк. Объекты типа String создаются с помощью конструктора. Хотя строковые значения и созданные конструктором строковые объекты (типа String) устроены и ведут себя в некоторых случаях по-разному, но все основные (перечисленные ниже) свойства и методы являются для них общими.

Все символы строки индексируются, начиная с 0. Индексы используется во многих методах. Все методы строк не изменяют значения переменных, хранящих исходные строки, а создают новую строку.

Конструктор объектов типаString

new String(строковый литерал) преобразует строковое значение в объект типа String с тем же значением

Свойство объектов типаString

строка.length длина (число символов) строки (равно n +1, где n – индекс последнего символа).

Методы объектов типаString

Работа с целыми строками

строка1.concat(строка2) соединение исходных строк в одну новую

строка.toLowerCase() возвращает строку, преобразованную к нижнему ре­гистру

строка.toUpperCase() возвращает строку, преобразованную к верхнему ре­гистру

String.fromCharCode(код1, код2, …,кодn) создание строки из Unicode-кодов символов

Работа с частью строки

строка.charAt(индекс) возвращает символ строки, указанный индексом

строка.charCodeAt(индекс) возвращает Unicode-коде указанного символа

строка.slice(индекс1[, индекс2]) возвращает часть строки, начиная с индекса1 и до индекса2 (не включая последний). Если индекс2 не ука­зан, то до конца строки. Метод не входит в стан­дарт ECMA

строка.substring(индекс1[, индекс2]) Если индекс1  индекс2, делает то же, что и ме­тод slice. Метод не входит в стан­дарт ECMA

строка.substr(индекс [, длина]) возвращает часть строки указанной длины, начиная с указанного индекса. Если индекс не указан, то до конца строки. Метод не входит в стандарт ECMA

Поиск подстроки

строка1.indexOf(строка2[, индекс1]) начиная с индекса1, слева направо ищет в стро­ке1 первое вхождение строки2 и выдаёт индекс начала этого вхождения. Если индекс1 не указан, поиск происходит с начала строки

строка1.lastIndexOf(строка2[, индекс1]) начиная с индекса1, справа налево ищет в стро­ке1 первое вхождение строки2 и выдаёт индекс начала этого вхождения. Если индекс1 не указан, поиск происходит с конца строки

Работа с шаблонами

строка.search (полный_шаблон) возвращает индекс первой подстроки, совпавшей с шаблоном, или –1

строка.replace (полный_шаблон, строка) возвращает новую строку, полученную из исходной заменой подстрок, совпавших с шаблоном, на указанный текст (важно использование уточнения g, иначе заменяет только первое вхождение)

строка.split (полный_шаблон) разрезает строку на подстроки, разделённые строками, совпавшими с шаблоном, и собирает из них результирующий массив

строка.match (полный_шаблон) возвращает массив подстрок, совпавших с шаблоном

Пример: Удаление лишних пробелов с помощью метода charAt

function delSpaces(s)

{ var n ="";

for (var i=0; i<s.length; i++)

{ c = s.charAt(i);

if (c != " ")

n += c

else

{ while (s.charAt(i+1)==" ")

i++;

if (s.charAt(i+1)!= "")

n += c

}

}; return n

};

С помощью шаблонов эта задача решается значительно проще (см. п. 27).