153
Листинг 5.18. Извлечение строки из массива
byData[]
protected string DataInStr()
{
byte[] byByte;
int L = DataInInt();
byByte = new byte[4 * L];
for (int j = 0; j <= 4 * L - 1; j++)
byByte[j] = byData[j + ofs];
char[] charData = new char[L];
Decoder d = Encoding.UTF32.GetDecoder();
d.GetChars(byByte, 0, byByte.Length, charData,
0);
string s = "";
for (int j = 0; j < charData.Length; j++)
s += charData[j];
ofs += 4 * L;
return s;
}
Извлечение строки снова происходит в четыре этапа:
−
извлекаем длину строки L;
− заполняем вспомогательный массив
byByte[] длиной
4*L;
− с помощью класса
Decoder перемещаем данные из массива by-
Byte[] в символьный массив
charData[];
− перемещаем данные из массива
charData[] в строку.
5.3. П
ОИСК В ГРАФАХ
Основой любого алгоритма поиска нужной вершины в графе является
перебор вершин, организованный так, чтобы каждая вершина просматривает-
ся не более одного раза. Критериями эффективности любого алгоритма и, в
частности, алгоритмов поиска являются:
− легкая читаемость алгоритма;
15 / 23
154
− выполнение требования однократности анализа любого ребра или
вершины.
5.3.1. П
ОИСК В ГЛУБИНУ
Поставим задачу поиска кратчайшего
пути между двумя вершинами
неориентированного графа. Очевидно,
что речь идет об алгоритме, реали-
зующем некоторый перебор возможных путей. Основной проблемой являет-
ся определение эффективного порядка перебора. Одним из подходов к реше-
нию этой задачи является так называемый
поиск в глубину (
depth first search).
Общая идея этого метода заключается в следующем: начиная поиск с какой-
то вершины
n, просматриваем список инцидентных ей ребер и, если находит-
ся соседняя непосещенная вершина, то
переходим в нее, далее продолжаем
алгоритм из этой вершины. Естественно, мы должны отмечать каждую посе-
щенную вершину, присваивая полю
Node[n].visit значение
true.
Do'stlaringiz bilan baham: