ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Последовательности
  #1  
Старый 11.01.2010, 12:45
marcos
Участник форума
Регистрация: 08.11.2009
Сообщений: 114
Провел на форуме:
201148

Репутация: -4
По умолчанию Последовательности

Всем привет!
Подскажите как вывести количество последовательностей длины N из нулей и единиц, не содержащих двух единиц подряд?
 
Ответить с цитированием

  #2  
Старый 11.01.2010, 12:52
drim
Участник форума
Регистрация: 27.08.2009
Сообщений: 131
Провел на форуме:
475164

Репутация: 33
По умолчанию

откуда и куда вывести? если из программы на STDOUT, то, обычно, оператор print помогает
 
Ответить с цитированием

  #3  
Старый 11.01.2010, 13:44
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме:
2050916

Репутация: 0


По умолчанию

Цитата:
Сообщение от marcos  
Всем привет!
Подскажите как вывести количество последовательностей длины N из нулей и единиц, не содержащих двух единиц подряд?
Ну если в лоб решать - то просто перебирай всевозможные комбинации нулей и единиц, и считай тольке те, у которых нет двух единиц подряд...
 
Ответить с цитированием

  #4  
Старый 11.01.2010, 14:38
][yZ
Познающий
Регистрация: 03.03.2009
Сообщений: 62
Провел на форуме:
1776253

Репутация: 106
По умолчанию

млин, это же легко...
короче, заведем двухмерный массив a[i, j], где i - длина последовательности, j - на что оканчивается (0 или 1)

a[1, 1] = 1
a[1, 0] = 1

потом, к нолику мы можем дописать или 0 или 1, т. е. a[i, 0] = a[i - 1, 0] + a[i - 1, 1]
к единице только нолик, т.е. a[i, 1] = a[i - 1, 0]
результат в a[n, 0] + a[n, 1]

как-то так
 
Ответить с цитированием

  #5  
Старый 11.01.2010, 16:53
desTiny
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме:
3008839

Репутация: 1502


По умолчанию

][yZ, если ещё соптимайзить, то можно заметить, что две твои последовательности имеют вид:
a_n = a_n-1 + b_n-1=a_n-1 + a_n-2
b_n = a_n-1

a_0=1; a_1=1 => a_n = n-1-ое число Фибоначчи F_n-1,
ответ: a_n-1+F_n-1 = F_n-1 + F_n-2 = F_n.
/*с индексами мог напутать, но вроде правда*/
__________________
Bedankt euch dafür bei euch selbst.

H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
 
Ответить с цитированием

  #6  
Старый 11.01.2010, 17:03
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

НУ я хз число фибоначи или когонить другова, чисто эксперементально рашил провести собственный опыт.

Искать через перебор в данном случае очень не рационально.
В большинстве случаев, там где есть перебор всех возможных комбинаций
На конечном множестве, то такие вещи почти всегда имеют формулы.
Или их можно вывести опытным путем.

Вот небольшие рассуждения:

Формула для полного числа комбинаций:
K= 2 ^ N.
И так.
если N = 1 то K = 2 ^ 1 = 2
0
1
Непоходят 0


если N = 2 то K = 2 ^ 2 = 4

00
01
10
11
Из низ видно что тока 1 неподходит.

Если N = 3 то K = 2 ^ 3 = 8
000
001
010
011
100
101
110
111
Из них 3 неподходит


Если N = 4 то K = 2 ^ 4 = 16
0000
0001
0010
0011
0100
0101
0110
0111

1000
1001
1010
1011
1100
1101
1110
1111
Из них 8 неподходит.

Если N = 5 то K = 2 ^ 5 = 32

00000
00001
00010
00011
00100
00101
00110
00111

01000
01001
01010
01011
01100
01101
01110
01111

10000
10001
10010
10011
10100
10101
10110
10111

11000
11001
11010
11011
11100
11101
11110
11111

Из них 19 не неподходит

ВОт простые вычисления. далее Строим таблицу.
N = длинна ряда
K = число комбинаций
G = Число подходящих вариант
B = Число не подходящих вариантов


0) N0 = 1 K0 = 2 G0 = 2 B0 = 0
1) N1 = 2 K1 = 4 G1 = 3 B1 = 1
2) N2 = 3 K2 = 8 G2 = 5 B2 = 3
3) N3 = 4 K3 = 16 G3 = 8 B3 = 8
4) N4 = 5 K4 = 32 G4 = 13 B4 = 19

Теперь простейшим поиском закономерности можно найти вот что:

G0 = 2
G1 = G0 + 1
G2 = G1 + G0
G3 = G2 + G1
G4 = G3 + G2

теперь видна сразу закономерность распределения подходящих чисел
и считатсья будет примерно так

Код:
const N = 5 ;
var
  x : integer;
  G : integer;
  LastG : integer;
  Tmp : integer;
begin
  LastG := 1;
  G := 2;
  for x := 1 to N do
  begin
    Tmp := G;
    G := G + LastG;
    LastG := Tmp;
  end;
  ShowMessage(inttostr(G));
end;
 
Ответить с цитированием

  #7  
Старый 11.01.2010, 17:13
desTiny
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме:
3008839

Репутация: 1502


По умолчанию

][yZ предложил естественное динамическое решение
я сказал общую формулу на его основании (хотя вообще это очевидно по другой причине: r_n = r_n-1 + r_n-2, так как мы могли взять любую последовательность длины n-1 и дописать "0" и любую длины n-2 и дописать "01")
slesh - а ты изварщенец, батенька )))
__________________
Bedankt euch dafür bei euch selbst.

H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
 
Ответить с цитированием

  #8  
Старый 11.01.2010, 17:30
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме:
2050916

Репутация: 0


По умолчанию

Цитата:
Сообщение от desTiny  
slesh - а ты изварщенец, батенька )))
Почему извращенец ?
Если есть аналитическое решение - то конечно его нужно использовать
 
Ответить с цитированием

  #9  
Старый 11.01.2010, 20:48
lukmus
Постоянный
Регистрация: 18.11.2009
Сообщений: 709
Провел на форуме:
1410429

Репутация: 214


По умолчанию

А теперь будем рассуждать логически-математически:
k(x) - функция количества чисел содержащих '11'
k(0)=0
k(1)=0
k(2)=1

11
k(3)=3
11 - число пришедшее от предыдущей разрядности
110 - числа полученный добавлением в начало '11' и перебором
111 - остальных свободных бит т.е. вида 11x

k(4)= 8
11
110
111
1011
1100
1101
1110
1111

С первыми 3-мя числами все ясно, они пришли от предыдущей разрядности. Последние четыре, то же ясны, они вида 11xx.
И остаеться одно интересное число - 1011, будем условно называть такие числа - числа Лакмусачи (Lukmusacci) ))).

k(5)=19
Количество складываеться из:
-8 чисел от предыдущей разрядности
-8 чисел вида 11xxx
-3 числа Лакмусачи

k(6)=43
Количество складываеться из:
-19 чисел от предыдущей разрядности
-16 чисел вида 11xxxx
-8 чисел Лакмусачи

Пронзительный читатель уже догадался к чему я виду:
количество чисел Лакмусачи для разрядности n равно k(n-2) , посмотрите внимательно Лакмусачи для 6 равно количеству чисел содержащих '11' для 4.

В итоге мы можем вывести эмпирическую функцию k(n):
k(n)=k(n-2)+k(n-1)+2^(n-2), где k(n-2) - числа Лакмусачи,
k(n-1) - числа пришедшие от прошлой разрядности, 2^(n-2) - числа вида 11x
.
Тем самым количество чисел не содержащих '11' для разрядности n равно: 2^(n) - k(n)=2^(n)-k(n-2)-k(n-1)-2^(n-2)
 
Ответить с цитированием

  #10  
Старый 12.01.2010, 01:02
lukmus
Постоянный
Регистрация: 18.11.2009
Сообщений: 709
Провел на форуме:
1410429

Репутация: 214


По умолчанию

Спомощью не сложных математических операций, можно апроксимировать эту функцию, не смотря на то что она дискретная.
Моего компьютера хватила только на апроксимацию многочленом 13-ой степени.
Тем самым получим не рекурсивную функцию вида y(x)=F(y(x-a1),y(x-a2),...,y(x-an)), полноценную функцию y=f(x)



маткадовский файл

Последний раз редактировалось lukmus; 12.01.2010 в 18:14..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Студентам с лабораторными сюда _Great_ С/С++, C#, Delphi, .NET, Asm 2868 16.06.2010 20:23
Школьникам разных городов сюда aka олимпиада по информатике banana Болталка 32 04.12.2009 19:15
Создание сети: обжимка проводов petrovich-lamer Windows 13 02.07.2007 13:18
SMTP fingerprint с использованием ID тэгов k00p3r Чужие Статьи 0 08.06.2005 15:10
Методика Захвата Соединения Tcp/ip k00p3r Чужие Статьи 0 08.06.2005 15:00



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ