Максим Дико извиняюсь, но нельзя ли как нибудь попроще? я просто еще плохо программирую, и плохо понимаю динамические структуры я понимаю, что я тебя уже достал, но не мог бы ты объяснить "метод Фибоначчи" на словах? а то до меня никак не допрет
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
HardMan TCryogenOptAPI - это класс моего объекта и ты его можешь не писать. А так, это все равно что писать TForm1 к примеру Динамические массивы - а что в них сложного то? Не хочешь с ними возиться, так не возись. Просто везде, где стоит крышка, то можешь ее убить.
GetOpt(Index).ID - это все равно как MyArr[Index] (у меня просто несколько другая задача, но переделать под твои нужды очень и очень легко.
Метод Фибоначчи примерно такой же, как и бинарный - он чуть-чуть по другому работает. Ему более важна не позиция, а значение по позиции.
Сейчас найду текст одной книжки Рода Стивенсона
Код:
Двоичный поиск оптимизирует поиск полным перебором, так как исключает большие части списка, не проверяя значения пропускаемых элементов. Если изве- стно, что значения распределены достаточно равномерно, то можно на каждом шаге исключить еще большее количество элементов, используя интерполяционный поиск (interpolation search) . Интерполяция - это процесс предсказания неизвестных значений на основе имеющихся. В данном случае вы используете индексы известных значений в спис- ке, чтобы определить, какой индекс должно иметь искомое значение. Предполо- жим, что вы имеете такой же список, как на рис. 10.2. Этот список содержит 20 элементов со значениями от 1 до 70. Допустим, что вы хотите найти в этом списке элемент со значением 44. Значение 44 составляет 64% размера диапазона от 1 до 70. Если считать, что значения элементов распределены равномерно, то искомый элемент, предположительно, будет находиться в позиции, составляющей 64% от размера списка - то есть в позиции с индексом 13. Если найденная алгоритмом позиция неверна, то он сравнивает искомое зна- чение со значением в выбранной позиции. Если искомое значение меньше, алго- ритм продолжает искать элемент в первой части списка, если больше, то поиск продолжается во второй части списка. На рис. 10.3 графически представлен про- цесс интерполяционного поиска.
Двоичный поиск разбивает список пополам. Интерполяционный поиск делит список, пытаясь найти ближайший к искомому элемент в списке, при этом точка разбиения определяется следующим кодом: Middle := Round(min + ((target - list^[min]) * ((max - min)/(list^[max] - l i s t^[min] ) ) ) ) ;
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
Dr.Alc_H>W Ну и в чем проблема то? Если тебе нужно из него только читать, то открываешь его не эксклюзивно и все. Если нужно писать в файл из нескольких программ, то можно написать цикл, который будет ждать максимум 5 секунд, чтобы записать файл. То есть все время пытаться открыть файл на запись, быстро записать и закрыть.
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Member
Статус: Не в сети Регистрация: 03.03.2006 Откуда: Москва
Максим Но нужно чтоб программа после запуска открывала и записывала инфу в файл не более чем за 1 сек. (лучше меньше), а другая проверяла на изменения за тоже самое время! Ошибка появляется не всегда. Пробовал всякими разными способами в том числе и Try Except... так можноли отключить в компеляторе генератор сообщений об ошибках???
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
Dr.Alc_H>W В компиляторе ты можешь отключить I/O Errors, только толку от этого будет немного.
А так, нужно пробовать как я сказал - пробовать писать в цикле и ждать не более 5 сек (в жизни будет точно меньше секунды, 5 сек - это тайм-аут), а когда читаешь - открывать файл без экслюзива. Добавлено спустя 54 секунды Я вот не помню, может можно как-то открыть файл без эксклюзива. Надо будет посмотреть сегодня.
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
как сделать что бы не было этих левых символов типа "\par"
Установить значение свойства PlainText в False. -> Точнее в True. По утрам быват притормаживаю… Подправил SaveAs для RichEdit из папки Demos.
Код:
procedure TMainForm.FileSaveAs(Sender: TObject); begin if SaveDialog.Execute then begin if FileExists(SaveDialog.FileName) then if MessageDlg(Format(sOverWrite, [SaveDialog.FileName]), mtConfirmation, mbYesNoCancel, 0) <> idYes then Exit; Editor.PlainText:= AnsiLowerCase(ExtractFileExt(SaveDialog.FileName)) <> '.rtf'; // Вот :))) Editor.Lines.SaveToFile(SaveDialog.FileName); SetFileName(SaveDialog.FileName); Editor.Modified := False; SetModified(False); end; end;
Последний раз редактировалось _SGK 15.12.2006 12:58, всего редактировалось 1 раз.
Добавлено спустя 2 минуты, 41 секунду Кстати, или же можно сделать вот так:
Код:
with TFileStream.create('c:\MyFile.doc', fmShareDenyWrite) do try read(b, 14); showmessage(b); finally Free; end;
Тогда тебе позволит в какой-то основной программе читать и писать, а в других только читать более-менее не эксклюзивно. Но правда опять же - до поры, до времени. Есть есть fmShareCompat - правда не разу им не пользовался, так что не знаю. Добавлено спустя 25 минут, 47 секунд HardMan Ну если ты массив нормально отсортируешь, то вот так будет работать.
Код:
function GetArray: mass; var i: integer; begin for i:=1 to maxarrsize do if Length(Form1.StringGrid1.Cells[i-1,0])=0 then Result[i]:=0 else Result[i]:=StrToInt(Form1.StringGrid1.Cells[i-1,0]); end;
procedure TForm1.Button1Click(Sender: TObject); var arr: mass; exs, middle, index: integer; min, max: Integer; begin arr:=GetArray; exs:=StrToInt(Edit1.Text); Min := 1; Max := MaxArrSize; Index := 0; while (min <= max) do begin middle := Round((max+min) / 2); if (exs = arr[middle]) then begin Index := middle; break; end else if exs < arr[middle] then max := middle - 1 else min := middle + 1; end; if index=0 then MessageDlg('Значение '+IntToStr(exs)+' в массиве не найдено.', MtInformation,[mbOk],0) else Label2.Caption:='Значение '+IntToStr(exs)+' найдено в массиве в позиции '+IntToStr(index);
end;
end.
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Member
Статус: Не в сети Регистрация: 23.12.2004 Откуда: Новосибирск
Если есть у когонибудь модуль XPStyleActnCtrls сбросьте на мыло ivan_f@bk.ru , можно конечно ссылку подбросить, также буду благодарен. Исходники достались по наследству, система была переустановлена и в инете не могу найти.
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
HardManDr.Alc_H>W Не за что.
Dr.Alc_H>W Вообще, чтение файлов не эксклюзивное легко устроить, а вот такую же запись уже чуть сложнее. Кстати нашел способ интереснее, только сложнее намного. Можно сделать через мапирование в память в фaйлов.
Или же самый легкий способ - все твои программы завязанны на одной dll, и там есть процедура записи в файл, причем в ней есть такая вещь как критическая секция. Тогда система сама подождет, пока процедуру выполнит предыдущая программа. Правда тут сразу есть мини проблема - нужно сделать так, чтобы эта dll была одной в памяти, а вот это не знаю как под Дельфей реализуемо. Спроси на енту тему у _SGK - он наверное сталкивался с такой штукой.
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Максим хм.. сейчас перделал код - все равно не пашет для простоты сделал maxarrsize=10, дык не находит кажется 3-ий 4-ый и 7-ой 8-ой элементы
например: -40 -25 -20 -3 0 6 11 28 30 34
как исходное пишу -20, дык рабтает сообщение, что не найдено
не знаю, что за х..... уже голову сломал
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
HardMan У меня работало Ща еще посмотрю. Добавлено спустя 8 минут, 37 секунд HardMan Вообщем ищи в своем коде ошибки. У меня все работает.
ВОт просто написал отладочный код.
Код:
procedure TForm1.Button1Click(Sender: TObject); Const MaxArrSize = 11; arr: Array [1..MaxArrSize] Of Integer = (-40, -25, -20, -3, 0, 6, 11, 20, 28, 30,34); var exs, middle, index: integer; min, max: Integer; begin exs:=20; Min := 1; Max := MaxArrSize; Index := 0; while (min <= max) do begin middle := Round((max+min) / 2); if (exs = arr[middle]) then begin Index := middle; break; end else if exs < arr[middle] then max := middle - 1 else min := middle + 1; end; if index=0 then MessageDlg('Значение '+IntToStr(exs)+' в массиве не найдено.', mtInformation,[mbOk],0) else MessageDlg('Значение '+IntToStr(exs)+' найдено в массиве в позиции '+ IntToStr(index), mtInformation,[mbOk],0); end;
Попробовал сначала найти -20, потом попробовал найти просто 20. потом пробовал изменять размер массива с 10 до 11 и тоже самое пробовал. Все работает без проблем.
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения