powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Пятничный треугольник
13 сообщений из 188, страница 8 из 8
Пятничный треугольник
    #39784239
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Aleksandr Sharahovинтересно, что тот же алгоритм с очевидными изменениями
находит 2 шара из 20 за 8 проверок, а вот что делать дальше неясно.и 2 из 23 за 8 можно, должен быть масштабируемый алгоритм

Barlone прав, число возможных расстановок C(k,N) а значит минимально достаточно log2(C(k,N)) бит что бы описать любой из вариантов расстановкине, эта оценка не всегда достижима 21827278 и 2 из 23 за 8 не получится
...
Рейтинг: 0 / 0
Пятничный треугольник
    #39784248
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlonekealon(Ruslan)пропущено...
и 2 из 23 за 8 можно, должен быть масштабируемый алгоритм

Barlone прав, число возможных расстановок C(k,N) а значит минимально достаточно log2(C(k,N)) бит что бы описать любой из вариантов расстановкине, эта оценка не всегда достижима 21827278 и 2 из 23 за 8 не получится

и причина тут тот же закон сохранения информации
например 2 из 16 не получится

т.к. C(16,2) = 120

C(12,2) = 66 > 64
а С(11,2) = 55 и останется 120 - 55 = 65, что тоже >64

исходя из этого же следует что в вашем алгоритме ошика, нельзя откусить первым шагом 3, только 4 или 5
...
Рейтинг: 0 / 0
Пятничный треугольник
    #39784249
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,

с 4 довольно тривиально, а вот с 5 я кое как придумал
...
Рейтинг: 0 / 0
Пятничный треугольник
    #39784250
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,
поправлю
исходя из этого же следует что в вашем алгоритме ошибка, нельзя "откусить" от 15-ти первым шагом 3, только 4 или 5

т.к. C(12,2) = 66 > 64
...
Рейтинг: 0 / 0
Пятничный треугольник
    #39784261
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan), дык он ад хок делал для 15/2ш. Попутно могло подойти и для нек-х других.
А вообще, в теории алгоритмов известны примеры неразрешимых массовых алгоритммических проблем, к-рые тем не менее имеют решения для частных случаев.
Это может означать к примеру, что высказанный Бароном метод построения алгоритма не универсален, но если поработать над методом (или над высказыванием), мало ли, может и получится универсальный для N/2.
Вообще же, это математическая задача, не программистская.

П.С. ссылка хорошая, кто-то ею уже попользовался))
...
Рейтинг: 0 / 0
Пятничный треугольник
    #39784263
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)а значит минимально достаточно log2(C(k,N)) бит что бы описать любой из вариантов Как осуществлять поиск 1 значения в массиве знают все. А вот как быстро искать 2 значения?
...
Рейтинг: 0 / 0
Пятничный треугольник
    #39784282
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98kealon(Ruslan)а значит минимально достаточно log2(C(k,N)) бит что бы описать любой из вариантов Как осуществлять поиск 1 значения в массиве знают все. А вот как быстро искать 2 значения?

Так же )

Хитрости типа 2 из 15 имеют смысл только на малых массивах,
а на больших задача "найти 2" превращается в задачу "2 раза найти 1".
...
Рейтинг: 0 / 0
Пятничный треугольник
    #39784306
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahovexp98пропущено...
Как осуществлять поиск 1 значения в массиве знают все. А вот как быстро искать 2 значения?

Так же )

Хитрости типа 2 из 15 имеют смысл только на малых массивах,
а на больших задача "найти 2" превращается в задачу "2 раза найти 1".
По сути на больших 2 из N мы можем улучшать только среднюю оценку
поиска. Но максимальную не улучшим.

Верно?
...
Рейтинг: 0 / 0
Пятничный треугольник
    #39784307
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, надо найти 2 из 32.
Рассмотрим крайние случаи.

1. Проверяем левую половину, затем правую,
и числа сразу попадают в разные части.
Сокращаем размер каждой части: 8-4-2-1.
Итого 2+4*2=10 проверок.

2. Проверяем левую половину, затем правую,
и каждый раз числа попадают в правую часть:
16-8-4-2. Итого 4*2+1=9 проверок.

С(2,32)=496~512=2^9, т.е. мы в принципе
не могли затратить меньше 9 проверок.
...
Рейтинг: 0 / 0
Пятничный треугольник
    #39784308
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovНапример, надо найти 2 из 32.
Рассмотрим крайние случаи.

1. Проверяем левую половину, затем правую,
и числа сразу попадают в разные части.
Сокращаем размер каждой части: 8-4-2-1.
Итого 2+4*2=10 проверок.

2. Проверяем левую половину, затем правую,
и каждый раз числа попадают в правую часть:
16-8-4-2. Итого 4*2+1=9 проверок.

С(2,32)=496~512=2^9, т.е. мы в принципе
не могли затратить меньше 9 проверок.

Сорри скопипастил сдуру,
во втором случае, конечно, всего 4 проверки.

В худшем случае мы тратим всего 1 лишнюю проверку
...
Рейтинг: 0 / 0
Пятничный треугольник
    #39784309
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Относительно средней оценки все выглядит так,
будто она мало зависит от алгоритма.
Плюс-минус одна проверка не имеет значения,
если их десятки.
...
Рейтинг: 0 / 0
Пятничный треугольник
    #39784328
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот, пришёл Александ и всё опошлил :-)
...
Рейтинг: 0 / 0
Пятничный треугольник
    #39784385
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вариант с первоначальным "откусыванием" 5 (без трививальной части )

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
program SetTest;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  SysUtils;

type
  TSetNum = 1..15;
  TSet = set of TSetNum;

  TTest = function(A: TSet): Boolean of object;


function BinS(m: TTest; a, b: Integer): TSet;
var
  l, i: Integer;
  v: TSet;
begin
  repeat
    l := a + (b - a) div 2;
    v := [];
    for i := a to l do
      v := v + [i];
    if m(v) then begin
      b := l;
      if l = a then
        Exit([a]);
    end else
    begin
      if a = l then
        Exit([b]);
      a := l + 1;
    end;
  until False;
end;

function Alg(m: TTest): TSet;
begin
  // Всего С(2,15) = 105
  if m([1..5]) then begin
    // C(2,5) + 5 * 10 =   60
    if m([4,5,6]) then begin
      // C(2,6) - C(2,3)  + 2 * 9 = 30
      if m([8..15]) then begin
        // 2 *  8 = 16
        Result := BinS(m, 4, 5) + BinS(m, 8, 15);
      end else begin
        // C(2,6) - C(2,3)  + 2 * 1 = 14
        if m([1, 6]) then begin
          // 3 + 4 = 7
          if m([1]) then begin
            // 3
            Result := [1] + BinS(m, 4, 6);
          end else begin
            // 4
            Result :=  [6] + BinS(m, 2, 5);
          end;
        end else begin
          // C(2,4) -1 + 2 = 7
          if m([2,3]) then begin
            // C(2,3) = 4
            Result := BinS(m, 2, 3) + BinS(m, 4, 5);
          end else begin
            // 3
            if m([7]) then
              Result := [7] + BinS(m, 4, 5)
            else
              Result := [4,5];
          end;
        end;
      end;
    end else begin
      // C(2,3) + 3* 9 = 30
      if m([3,7,8]) then begin
        // C(2, 5) - 2 {без [1,2] и [7,8]} + 1 * 7 = 15
        if m([9..15]) then begin
          // 7
          Result := [3] + BinS(m, 9, 15);
        end else begin
          // C(2, 5) - 2 = 8
          if m([3]) then begin
            // 4
            if m([7,8]) then begin
              if m([7]) then
                Result := [7]
              else
                Result := [8];
            end else begin
              if m([1]) then
                Result := [1]
              else
                Result := [2];
             end;
            Result := Result + [3];
          end else begin
            // 2 * 2 = 4
            if m([1]) then
              Result := [1]
            else
              Result := [2];
            if m([7]) then
              Result := Result + [7]
            else
              Result := Result + [8]
          end;
        end;
      end else begin
        // C(2,2) + 2 * 7 = 15
        if m([12..15]) then begin
          // 2 * 4 = 8
          Result := BinS(m, 1, 2) + BinS(m, 12, 15);
        end else begin
          // C(2,2) + 2 * 3 = 7
          if m([10,11]) then begin
            // 2 * 2
            Result := BinS(m, 1, 2) + BinS(m, 10, 11);
          end else begin
            //C(2,2) + 2 * 1 = 3
            if (m([9])) then begin
              Result := BinS(m, 1, 2) + [9];
            end else begin
              Result := [1,2];
            end;
          end;
        end;
      end;
    end;
  end else begin
    // С(2, 10) = 45   - тривиальный, не буду рассматривать
    Result := [];
  end;
end;

type
  TSetTest = record
    v: TSet;
    c: Integer;
    constructor create(i,j: Integer);
    function Con(A: TSet): Boolean;
  end;

function TSetTest.Con(A: TSet): Boolean;
begin
  Inc(c);
  Result := (v * A <> []);
end;

constructor TSetTest.Create(i, j: Integer);
begin
  c := 0;
  v := [i,j];
end;

var
  i,j: Integer;
  TestM: TSetTest;
  s: TSet;
begin
  try
    for i := 1 to 5 do
      for j := i + 1 to 15 do begin
        TestM := TSetTest.create(i,j);
        s := Alg(TestM.Con);
        if (TestM.v <> s)or(TestM.c > 7) then begin


          TestM := TSetTest.Create(i,j);
          s := Alg(TestM.Con);

          raise Exception.Create('Error Message');
        end;
      end;
    Writeln('Ok');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

...
Рейтинг: 0 / 0
13 сообщений из 188, страница 8 из 8
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Пятничный треугольник
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]