IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Бинарный (двоичный) поиск, только для отсортированного массива
klem4
сообщение 24.02.2005 18:35
Сообщение #1


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


value - искомое значение
right и left - сдвигающиеся границы массива.


Код

procedure bin_s;
var
  value:integer{array type};
  x:array[1..n] of integer;
  i,nn,nfind,right,left:integer;
begin
  writeln('value=');readln(value);
  left:=1;
  right:=n;
  while ((right-left)>1) do
   begin
      nn:=(right+left) div 2;
      if value<=x[nn] then
       right:=nn
        else left:=nn;
   end;
   if value=x[left] then
    nfind:=left
     else if value=x[right] then
      nfind:=right;
  writeln('nfind=',nfind);
  readln;
end;


Скорость :
1000 элементов - 10 итераций цикла.

Процедура не срабатывает с такими исходными данными (возвращается результат "nfind = 2"):
const
n = 20;
x: array[1 .. n] of integer =
( 4, 5, 6, 15, 18, 21, 28, 32, 34, 38,
43, 44, 49, 50, 59, 60, 63, 73, 77, 85);
{ Значение для поиска: value = 34 }

Volvo


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
klem4
сообщение 25.02.2005 8:06
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


НЕ знаю почему, я с этим уже сталкивался и объяснить не могу, но вот так работает :

Код
const n = 20;

const
x: array[1 .. n] of integer =
  ( 4,  5,  6, 15, 18, 21, 28, 32, 34, 38,
   43, 44, 49, 50, 59, 60, 63, 73, 77, 85);

{ задай для поиска value = 34 }

procedure bin_s;
var
value:integer{array type};
 { тут не надо объявлять массив ! ! !}
i,nn,nfind,right,left:integer;
begin
writeln('value=');readln(value);
left:=1;
right:=n;
while ((right-left)>1) do
  begin
    nn:=(right+left) div 2;
    if value<=x[nn] then
      right:=nn
    else left:=nn;
  end;

if value=x[left] then
  nfind:=left
else if value=x[right] then
       nfind:=right;
writeln('nfind=',nfind);
readln;
end;

var i: integer;
begin
for i := 1 to n do
  write(x[i]:4);
writeln;

bin_s
end.


Теперь все просто отлично работает, но почему!!!!?? не работало до этого ??
ИМХО это баги паскаля, связанные с глобальными и локальными переменными...

Сообщение отредактировано: klem4 - 25.02.2005 8:12


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 25.02.2005 10:41
Сообщение #3


Гость






Цитата(klem4 @ 25.02.05 7:06)
ИМХО это баги паскаля, связанные с глобальными и локальными переменными...

Это не баги паскаля, а неверное проектирование... У тебя же процедура для поиска, так что, для того, чтобы ей воспользоваться я должен залезть вовнутрь и изменить ее содержимое? Ты изначально должен был расположить массив за пределами процедуры...

Кстати, еще вопрос:
Допустим, у тебя 3 массива: X, X1, X2.
Код

Var x, x1, x2: array[1 .. n] Of integer;
Procedure bin_s;
Begin ... End;

{ Вот тут тебе надо найти номер элемента из массива X1 }
...
{ тут - элемента из массива X2 }
...
{ а вот тут - номер элемента из массива X }

Твои действия?

Или еще более коварный вариант - если все 3 массива имеют разную размерность...
 К началу страницы 
+ Ответить 
volvo
сообщение 26.02.2005 15:38
Сообщение #4


Гость






Цитата(volvo @ 25.02.05 9:41)
Или еще более коварный вариант - если все 3 массива имеют разную размерность...

Я так понимаю, этот вариант не рассматривался? smile.gif
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 5:14
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"