КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Билет 26.1. Сравнительный анализ алгоритмов поиска: линейный, двоичный. Само действие поиска элемента в наборе данных требует возможности отличать элементы друг от друга. Очевидно, сравнение числовых типов не вызывает трудности. В случае сравнения строк процедура усложняется. Можно выполнять сравнение чувствительное или нечувствительное к регистру, сравнение по локальным таблицам символов, когда оно выполняется на основе алгоритмов, специфичных для определенной страны или языка и т.д. При работе с объектами вообще не существует заранее определенной схемы сравнения за исключением сравнения указателей на эти объекты. В таком случае лучше всего рассматривать процедуру сравнения в виде «черного ящика» – функции с четко определенным интерфейсом, которая в качестве входных параметров принимает указатели на два элемента и возвращает результат сравнения – первый элемент больше, меньше или равен второму. Линейный поиск. Единственно возможным методом поиска элемента по значению ключа, находящегося в неупорядоченном наборе данных, является последовательный (линейный) просмотр каждого элемента, который продолжается до тех пор, пока не будет найден искомый элемент. Если просмотрен весь набор, но элемент не найден, искомый ключ отсутствует. Для последовательного поиска в среднем требуется (n+1)/2 сравнений и порядок алгоритма линейный O(n). Программная иллюстрация линейного поиска в неупорядоченном массиве приведена ниже, где aList – исходный массив, aItem – искомый ключ; функция возвращает индекс найденного элемента или -1, если элемент отсутствует.
{ Линейный поиск в неотсортированном массивом } function LineNonSortedSearch(aList: TList; aItem: Pointer; aCompare: TCompareFunc): Integer; var i: Integer; begin Result:=-1; for i:=0 to aList.Count-1 do if aCompare(aList.List[i],aItem) = 0 then begin Result:=i; Break; end; end;
Последовательный поиск для отсортированного массива ничем не отличается от приведенного и имеет линейный порядок алгоритма O(n). Бинарный поиск. Другим относительно простым методом доступа к элементу является бинарный (двоичный или дихотомичный) поиск, который выполняется в заведомо упорядоченной последовательности элементов. Элементы массива должны располагаться в лексикографическом (символьные ключи) или численно (числовые ключи) возрастающем порядке. Для достижения упорядоченности может быть использован один из методов сортировки. В методе сначала приближенно определяется запись в середине массива и анализируется значение ее ключа. Если оно слишком велико, то анализируется значение ключа, соответствующего записи в середине первой половины массива, и указанная процедура повторяется в этой половине до тех пор, пока не будет найдена требуемая запись. Если значение ключа слишком мало, испытывается ключ, соответствующий записи в середине второй половины массива, и процедура повторяется в этой половине. Процесс продолжается до тех пор, пока не найден требуемый ключ или не станет пустым интервал, в котором осуществляется поиск. Чтобы найти элемент, в худшем случае требуется log2(N) сравнений, что значительно лучше, чем при последовательном поиске. Программная иллюстрация бинарного поиска в упорядоченном массиве приведена ниже.
{ Двоичный поиск } function BinarySearch(aList: TList; aItem: Pointer; aCompare: TCompareFunc): Integer; var L, R, M, CompareResult: Integer; begin { Значения индексов первого и последнего элементов } L:=0; R:=aList.Count-1; while L <= R do begin { Индекс среднего элемента } M:=(L + R) div 2; { Сравнить значение среднего элемента с искомым } CompareResult:=aCompare(aList.List[M], aItem); { Если значение среднего элемента меньше искомого - переместить левый индекс на позицию до среднего индекса } if CompareResult < 0 then L:=M+1 else { Если значение среднего элемента больше искомого - переместить правый индекс на позицию после среднего индекса } if CompareResult > 0 then R:=M-1 else begin Result:=M; Exit; end; end; Result:=-1; end;
2. Факторы, определяющие развитие архитектуры вычислительных систем. Совершенствование архитектуры вычислительных машин и систем началось с момента появления первых ВМ и не прекращается по сей день. Каждое изменение в архитектуре направлено на абсолютное повышение производительности или, по крайней мере, на более эффективное решение задач определенного класса. Эволюцию архитектур определяют самые различные факторы, главные из которых показаны на рис. 1.7. Не умаляя роли ни одного из них, следует признать, что наиболее очевидные успехи в области средств вычислительной техники все же связаны с технологическими достижениями. Рис. 1.7. Факторы, определяющие развитие архитектуры вычислительных систем С каждым новым технологическим успехом многие из архитектурных идей переходят на уровень практической реализации. Очевидно, что процесс этот будет продолжаться и в дальнейшем, однако возникает вопрос: «Насколько быстро?» Косвенный ответ можно получить, проанализировав тенденции совершенствования технологий, главным образом полупроводниковых. Основные тенденции: Тенденции развития больших интегральных схем - Наиболее перспективным представляется увеличение размеров кристалла Пока основные успехи в плане увеличения емкости СБИС связаны с уменьшением размеров элементарных транзисторов и плотности их размещения на кристалле Тенденции развития элементной базы процессорных устройств - К увеличению числа логических элементов на кристалле ведут три пути: увеличение размеров кристалла; уменьшение размеров элементарных транзисторов; уменьшение ширины проводников, образующих внутренние шины или соединяющих логические элементы между собой. Тенденции развития полупроводниковых запоминающих устройств - По мере повышения возможностей вычислительных средств растут и «аппетиты» программных приложений относительно емкости основной памяти. В целом можно предсказать, что число запоминающих элементов на кристалле будет возрастать в два раза каждые полтора года, запоминающих устройств основной памяти. Перспективные направления исследований в области архитектуры - Основные направления исследований в области архитектуры ВМ и ВС можно условно разделить на две группы: эволюционные и революционные. К первой группе следует отнести исследования, целью которых является совершенствование методов реализации уже достаточно известных идей. Изыскания, условно названные революционными, направлены на создание совершенно новых архитектур, принципиально отличных от уже ставшей традиционной фон-неймановской архитектуры. Появление образцов с нетрадиционной архитектурой.
3. Составить программу, которая формирует очередь, добавляя в неё произвольное количество компонент.
|