| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Метод бинарного поиска
Метод
бинарного поиска На практике довольно
часто производится поиск в массиве, элементы которого упорядочены по некоторому
критерию (такие массивы называются упорядоченными). Например, массив фамилий,
как правило, упорядочен по алфавиту, массив данных о погоде — по датам наблюдений.
В случае, если массив упорядочен, то применяют другие, более эффективные по
сравнению с методом простого перебора алгоритмы, один из которых — метод бинарного
поиска. Пусть есть упорядоченный
по возрастанию массив целых чисел. Нужно определить, содержит ли этот массив
некоторое число (образец). Метод (алгоритм) бинарного
поиска реализуется следующим образом: 1. Сначала образец
сравнивается со средним (по номеру) элементом массива (рис. 5.10, а).
a
б
в Рис. 5.10.
Выбор среднего элемента массива при бинарном поиске
Рис. 5.11. Алгоритм
бинарного поиска в упорядоченном по возрастанию массиве 2. После того как определена
часть массива, в которой может находиться искомый элемент, по формуле (niz-verh)
/2+verh вычисляется новое значение sred и поиск продолжается. Алгоритм бинарного
поиска, блок-схема которого представлена на рис. 5.11, заканчивает свою работу,
если искомый элемент найден или если перед выполнением очередного цикла поиска
обнаруживается, что значение verh больше, чем niz. Вид диалогового окна
программы Бинарный поиск в массиве приведен на рис. 5.12. Поле метки
Label3 используется для вывода результатов поиска и протокола поиска. Протокол
поиска выводится, если установлен флажок выводить протокол. Протокол
содержит значения переменных verh, niz, sred. Эта информация, выводимая во время
поиска, полезна для понимания сути алгоритма.
Рис. 5.12.
Диалоговое окно программы Бинарный поиск в массиве В форме приложения
появился новый компонент, который до этого момента в программах не использовался,
— флажок (компонент CheckBox). Значок компонента checkBox находится на вкладке
Standard (рис. 5.13). Добавляется к форме он точно так же, как и другие
компоненты. Свойства компонента CheckBox перечислены в табл. 5.5. Таблица 5.5.
Свойства компонента CheckBox
Рис. 5.13.
Компонент CheckBox После того как компонент
CheckBox будет добавлен к форме, а добавляется он обычным образом, нужно установить
значения его свойств в соответствии с табл. 5.6. Таблица 5.6.
Значения свойств компонента CheckBox1
В листинге 5.8 приведен
текст процедуры обработки события Onclick для командной кнопки Поиск (Button1).
Процедура вводит значения элементов массива и образец, затем, используя алгоритм
бинарного поиска, проверяет, содержит ли массив элемент, равный образцу. Кроме
того, переменная п (число сравнений с образцом) позволяет оценить эффективность
алгоритма бинарного поиска по сравнению с поиском методом простого перебора. При вычислении номера
среднего элемента используется функция тгипс, которая округляет до ближайшего
целого и преобразует к типу integer выражение, полученное в качестве аргумента.
Необходимость использования тгипс объясняется тем, что выражение (niz-verh)
/2 — дробного типа, переменная
sred — целого, а переменной целого типа присвоить дробное значение нельзя (компилятор
выдаст сообщение об ошибке). Обратите внимание на
процедуры обработки события onKeyPress для компонентов stringGridl и Editl.
Первая из них обеспечивает перемещение курсора в следующую ячейку таблицы или
в поле Editl (из последней ячейки) в результате нажатия клавиши <Enter>,
вторая — активизирует командную кнопку Поиск также в результате нажатия
клавиши <Enter>. Листинг 5.8.
Бинарный поиск в массиве unit
b_found_; interface uses Windows, Messages, SysUtils, Classes, Graphics,
Controls,
Forms, Dialogs, StdCtrls, Grids; type TForm1
= class(TForm) Label1:
TLabel; Label2:
TLabel; Button1:
TButton; Label3:
TLabel; CheckBox1:
TCheckBox; StringGrid1:
TStringGrid; Editl:
TEdit; procedure
ButtonlClick(Sender: TObject); procedure
StringGridlKeyPress(Sender: TObject; var Key: Char); procedure
EditlKeyPress(Sender: TObject; var Key: Char); private {Private declarations } public { Public declarations } end; var Form1:
TForm1; implementation {$R
*.DFM}
{ Бинарным поиск в массиве } procedure TForm1.Button1Click(Sender: TObject); const SIZE=10;
var a:array[1..SIZE]
of integer; { массив ) obr:integer;
{ образец для поиска} verh:integer;
{ верхняя граница поиска } niz:
integer; { нижняя граница поиска } sred:integer;
{ номер среднего элемента ) found:boolean;
{ TRUE — совпадение образца с элементом массива } n:integer;
/ число сравнений с образцом } i:integer; begin // ввод массива и образца for
i:=l to SIZE do a[i]:=StrToInt(StringGridl.Cells[i-l,0] ) ; obr
:= StrToInt(Editl.text); // поиск verh:=1; niz:=SIZE;
n:=0; found:=FALSE;
labels.caption:=''; if
CheckBoxl.State = cbChecked then
Labels.caption: ='verh'+#9+'niz'#9'sred' #13; //
бинарный поиск в массиве repeat sred:=Trunc
( (niz-verh) /2)+verh; if CheckBox1.Checked then
Labels.caption:=label3.caption +IntToStr(yerh) + #9 +IntToStr(niz)
+ #9 +IntToStr(sred) + #13; n:=n+1; if
a[sred] = obr then found:=TRUE else if
obr < a[sred] then niz:=sred-1 else verh:=sred+1; until
(verh > niz) or found; if
found then
labels.caption:=label3.caption +'Совпадение с элементом номер ' + IntToStr(sred)+#13 + 'Сравнений ' + IntToStr(n) else
label3.caption:=label3.caption +'Образец в массиве не найден.'; end; //
нажатие клавиши в ячейке StringGrid procedure
TForml.StringGridlKeyPress(Sender: TObject; var Key: Char), begin if
Key = #13 then // нажата клавиша <Enter> if StringGrid1.Col < StringGridl.ColCount - 1 then // курсор в следующую ячейку таблицы StringGridl.Col := StringGrid1.Col +1 else
// курсор в поле Editl, в поле ввода образца Editl.SetFocus; end; //
нажатие клавиши в поле Editl procedure
TForm1.Edit1KeyPress(Sender: TObject;. var Key: Char); begin if
Key = #13 // нажата клавиша <Enter> then
// сделать активной командную кнопку Button1.SetFocus; end; end. Ниже приведены примеры
диалоговых окон программы Бинарный поиск в массиве после выполнения поиска—
с выводом протокола (рис. 5.14, а) и без протокола (рис. 5.14, б). Здесь следует обратить
внимание на то, что элемент массива, находящийся на седьмом месте, программа
бинарного поиска находит всего за четыре шага, в то время как программе, реализующей
алгоритм простого перебора, потребовалось бы семь шагов.
а
б Рис. 5.14. Примеры работы программы бинарного поиска в массиве Рубрика: Глава 5. Массивы
HTML 5: пять вещей вызывающих особый интер....
HTML 5 — это грядущее обновление гипертекстового языка разметки, основного способа создания контента для размещения его во всемирной паутине. Разработка HTML остановилась в 1999 году, на версии HTML 4.01 и с тех пор web-содержимое изменилось так, что текущие спецификации HTML перестали соответствовать сегодняшним требованиям. HTML 5 нацелен на то, чтобы увеличить функциональную совместимость HTML и соответствовать растущим требованиям разнообразного и смешанного web-контента. HTML 5 так же нацелен на устранение недостатков четвертой версии. В этой статье мы взглянем на 5 новых интересных вещей в HTML 5.
Подробнее... |
Рубрика: Html
| Добавлено: 22.12.2008
asp.net: ListView с разных сторон.
Элемент управления ListView был представлен в .Net Framework 3.5 как замена устаревшему GridView. Новый элемент имеет более расширенный функционал, чем его предшественник, но в тоже время лишен некоторых внутренних механизмов, что впрочем целиком следствие из расширенной универсальности ListView. Среди отличий ListView и GridView можно назвать и гибкую настройку разметки, что позволяет выводить данные не только в табличном виде, но и вообще в любом каком пожелает программист. Благодаря шаблонам ItemTemplate, EditItemTemplate, InsertItemTeplate можно настроить внешний вид при любом из состояний ListView: редактировании или выборе элемента.
Подробнее... |
Рубрика: .NET компоненты
| Добавлено: 22.12.2008
Создание кросс-таб отчета в Stimulsoft Rep....
Компания Стимулсофт предоставляет для разработчиков мощный набор инструментов для создания отчетов для Microsoft Visual Studio .Net 2005 и 2008; эти инструменты доступны как для Windows Forms, так и для Web Forms. Это генератор отчетов Stimulsoft Reports.Net. Генератор отчетов Stimulsoft Reports.Net имеет ряд особенностей: простая работа с дизайнером отчетов, полная поддержка экспорта в PDF, Word, Excel и многие другие форматы. Crystal Report и Microsoft Reporting Service – очень хорошие программные продукты для повседневной работы, но, если Вам необходимо создать отчеты с поддержкой кросс-табов, drill down, Ajax, штрих-кодов и возможностью подключения одновременно более одного источника данных, то Stimulsoft Reports.Net поможет Вам сэкономить массу времени. Также, данный генератор отчетов позволяет пользователям создавать свои собственные отчеты любой сложности. И все эти особенности делают Stimulsoft Reports.Net хорошим выбором в сфере программных продуктов для Business Intelligence.
Подробнее... |
Рубрика: .NET компоненты
| Добавлено: 22.12.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|