Studopediya

КАТЕГОРИЯ:


Астрономия- (809) Биология- (7483) Биотехнологии- (1457) Военное дело- (14632) Высокие технологии- (1363) География- (913) Геология- (1438) Государство- (451) Демография- (1065) Дом- (47672) Журналистика и СМИ- (912) Изобретательство- (14524) Иностранные языки- (4268) Информатика- (17799) Искусство- (1338) История- (13644) Компьютеры- (11121) Косметика- (55) Кулинария- (373) Культура- (8427) Лингвистика- (374) Литература- (1642) Маркетинг- (23702) Математика- (16968) Машиностроение- (1700) Медицина- (12668) Менеджмент- (24684) Механика- (15423) Науковедение- (506) Образование- (11852) Охрана труда- (3308) Педагогика- (5571) Полиграфия- (1312) Политика- (7869) Право- (5454) Приборостроение- (1369) Программирование- (2801) Производство- (97182) Промышленность- (8706) Психология- (18388) Религия- (3217) Связь- (10668) Сельское хозяйство- (299) Социология- (6455) Спорт- (42831) Строительство- (4793) Торговля- (5050) Транспорт- (2929) Туризм- (1568) Физика- (3942) Философия- (17015) Финансы- (26596) Химия- (22929) Экология- (12095) Экономика- (9961) Электроника- (8441) Электротехника- (4623) Энергетика- (12629) Юриспруденция- (1492) Ядерная техника- (1748) Arhitektura- (3434) Astronomiya- (809) Biologiya- (7483) Biotehnologii- (1457) Военни бизнесмен (14632) Висока technologies- (1363) Geografiya- (913) Geologiya- (1438) на държавата (451) Demografiya- ( 1065) Къща- (47672) журналистика и смирен (912) Izobretatelstvo- (14524) външен >(4268) Informatika- (17799) Iskusstvo- (1338) историята е (13644) Компютри- (11,121) Kosmetika- (55) Kulinariya- (373) културата е (8427) Lingvistika- (374) Literatura- (1642) маркетинг-(23702) математиците на (16968) Механична инженерно (1700) медицина-(12668) Management- (24684) Mehanika- (15423) Naukovedenie- (506) образователна (11852) truda- сигурност (3308) Pedagogika- (5571) Poligrafiya- (1312) Politika- (7869) Лево- (5454) Priborostroenie- (1369) Programmirovanie- (2801) производствено (97 182 ) индустрия- (8706) Psihologiya- (18388) Religiya- (3217) Svyaz (10668) Agriculture- (299) Sotsiologiya- (6455) на (42831) спортист строително (4793) Torgovlya- (5050) транспорт ( 2929) Turizm- (1568) физик (3942) Filosofiya- (17015) Finansy- (26596) химия (22929) Ekologiya- (12095) Ekonomika- (9961) Electronics- (8441) Elektrotehnika- (4623) Мощност инженерно ( 12629) Yurisprudentsiya- (1492) ядрена technics- (1748)

Алгоритъм. Най-лесният начин да двойна линия през всички двойки с началните и крайните номера за всеки интервал и да намери сумата на числата

пример

заключение

влизане

пример

4 -19 -4 -23 21 Февруари 15 юни -2 5

на 10 април

Най-лесният начин да двойна линия през всички двойки с началните и крайните номера за всеки интервал и намери сумата от цифрите. Максималната сума, ще отговори на проблема. Да се ​​оцени сложността на този подход. Двойна цикъл обикновено води до сложност O (N 2), и общата сложността ще бъде О (N 3), който е напълно неприемливо.

По-ефективно по време на първото преминаване в масива да се натрупват частични суми S, т.е. определяне на стойностите на S I = X 1 + X 2 + ... + X аз. Тогава X I + X и 1 + ... + X J = S й - S аз -1. Този подход осигурява, че сложността на O (N 2), които също не могат да ни задоволи.

Оказва се, че има линейна алгоритъм с сложност O (N), която ви позволява да правите дори без масива, обработката на данните с едно минаване директно от файла [17]. Ние ще задържат най-добрите елементи от сумата на R на всяка стъпка и съответния интервал на индекса, както и работа общо елементите S. Ако в следващия етап I-ти намери положителен елемент X аз, и където S <0 след това да започне да отброява времето до старта, извеждайки S = X аз. В противен случай, ние добавяме стойността на X и към текущия размер на S. сравнение стойностите на R и S. Максималната на тези стойности ще се запази размерът на R като най-добрите елементи на I-ия етап и преминете към следващата стъпка. По-долу е текста на програмата, който реализира този алгоритъм.

Програма BentFile; {Linear алгоритъм}

Var

N, I, J, X, R, S, Res: LongInt;

{R- максимална сума в предишната стъпка, S-текущата сума} Fin, Fout: текст;

Ra, Rb, Sa, Sb, а, б: LongInt;

{Области на индекси, които осигуряват на максималния размер за R, S и обща максимална сума}

започвам

Присвояване (Fin, "input.txt");

Reset (Fin); ReadLn (Fin, N);

R: = - MaxLongInt; S: = 0;

Sa: = 1; Sb: = 1; Ra: = 1; Rb: = 1; A: = 1; б: = 1;

Защото: = 1 до N направя

започвам

Прочетете (Fin, X);

ако (S <0) и (X> = 0), след това

започвам

Sa: = I; S: = X

край

друго S: = S + X;

Sb: = I;

ако X> R след това

започвам

Ra: = I; Rb: = I; R: = X

приключи;

ако S> R след това

започвам

Res: = S; A: = Sa; б: = Sb;

Ra: = Sa; Rb: = Sb; R: = Res;

край

още

започвам

A: = Ra; б: = Rb; Res: = R;

приключи;

приключи;

Close (Fin);

Присвояване (Fout, "output.txt"); Препишете (Fout);

WriteLn (Fout, Res);

WriteLn (Fout, а, '', б);

Close (Fout);

Край.

Следващият пример демонстрира възможността на различни подходи за решаване на проблема, че принципно се различават по сложност.

Щастливи билети. Известно е, че "щастлив" билет се нарича билет, в една стая, която е сбор от цифри от първата половина на броя е сумата от цифрите на втората половина от стаите. Този номер може да започне с 0. Find брой щастливи числа между 2 N-ценен билет (1 ≤ N ≤ 20) а.



Input от INPUT.TXT файл. Единственият ред съдържа стойността на N (1 ≤ N ≤ 20).

Output в output.txt файл. Единният линия показва броя на късмет номера.

Output в output.txt файл. Единният линия показва броя на късмет номера.

Пример:

вход (input.txt) Imprint (output.txt)

изчерпателен алгоритъм за търсене е приложим за стойности на N до 3-4. Ние описват две по-ефективни начини.

вариант 1

Нека разгледаме първите числа п. N максимален брой цифри е 10, M = N -1. Максималният размер на номера K = 9N.

Ръководител на масив C от K + 1 броячи. В C аз ще запази броя на номера в обхвата от 0 до M, със сумата на числата I (0 ≤ I ≤ K). Цикълът от 0 M да се определят стойностите на всички броячи.

Броят на щастливи числа, чиято сума от цифри на всяка половина на цифрите, а аз се равнява на C и 2. Остава да се намери сумата от квадратите на всички стойности на броячите за аз от 0 до К. Алгоритъмът е приложим за стойности на N до 6-7.

вариант 2

Разгледа отново първите числа п. Нека F (I, J) броя на цифрите на номера от I до размера на номера J. извлече повторение отношения за F (I, J).

· F (1, J) = 1 за J = 0, ..., 9, който може да се получи цифра от 0 до 9 ..;

· F (1, J) = 0 за J = 10, ..., 9N, м една цифра е невъзможно да се постигне стойност от 10 или повече ..;

· F (I 1, J) = F (I, J) + F (I, J-1) + ... + F (I, J-L), L ≤ 9, J - L ≥ 0, където първия срок съответства на броя 0 в положение I 1, а вторият - числото 1, и така нататък ..

Съгласно тази формула изчислява F стойност (I, J) на

· I = 2, ..., N;

· J = 0, 1, ..., 9N.

Броят на щастливи числа, чиято сума от цифри на всяка половина на стаята е J, е F (N, J) 2. Остава да се намери сумата от квадратите на стойностите на F (N, J) за всички J от 0 до 9N. броене на времето за тази опция е минимална.

В заключение, ние се отбележи, че за големи размери наложи дълго аритметика. Вместо на двумерен масив, можете да направите двумерни масиви, като при изчисляване на функцията F на (I, J) изисква само две последователни стъпки на I.

За N = 20 отговори 218768894829904122626725603838896148680. време отчита по-малко от секунда.

Много проблеми могат лесно да бъдат програмирани чрез рекурсия. И в този случай, за оценка на сложността на алгоритми.

Нека се върнем към примера на проблема с костенурка разглежда в динамичен раздел програмиране. Всичко се свежда до намиране на най-краткия път от горния ляв ъгъл на матрицата C на измерение M × N, изпълнен с номера в долния десен ъгъл. Пътят се състои от преход от матрицата надясно или надолу. Ние се ограничи да установи минимална пътя на разходите, без дефиниция на пътя.

Очевидното решение е да се напише следната рекурсивна функция, която намира минималния пътя на цена от матрицата клетка с координатите (И, Й) до края.

Функция F (I, J: число): longint;

започвам

ако (I = М) и (J = N), след това F: С = [М, М]

още

ако аз = M тогава F: = C [I, J] + F (I, J + 1)

още

ако й = N след това F: = C [I, J] + F (I + 1, й)

още

ако F (I + 1, й) <F (I, J + 1), след това F: = С [а, д] + F (I + 1, й)

друг F: С = [I, J] + F (I, J + 1);

Край;

Отговорът дава стойност на функция ко (1,1). Вече от размера на матрицата от 10 х 10 програма се изпълнява повече от 20 секунди. Фактът, че ние извършваме изчерпателно търсене на начини, многократно преброяване на стойността на функцията за всяка клетка от матрицата. С нарастването на сложността на измерение на матрицата увеличава експоненциално.

Можете, разбира се, не забравяйте, функцията на намерените в таблицата стойности, не ги брои отново. Но по този начин ние всъщност се връщаме към динамично програмиране.

Един общ метод за повишаване на ефективността на работата с компютър е бинарен (двоичен) търсене, известен по компютърни науки, като метод за противопоставяне. Тя може да се използва както за определяне на допустимите стойности на непрекъснати параметри, и да търсите за един елемент в сортиран масив. При търсене на елемент са предварително определена стойност или максималната стойност на които не надвишава определения.

Програмиране двоично търсене за всички доказателства, свързани с формулирането на редица нюанси. Въпреки че първият двоичен търсенето е публикувана през 1946 г., цялостно решение, което избягва всички капани, е публикувана само през 1962.

По-малко добре познати трикратно (троен) Търсене използвани за намиране на екстремуми unimodal функции, т.е. тези, които или са строго увеличаване на първо, и след това строго намаляваща, или обратното. Трикомпонентни търсене определя, че минималната или максималната не може да лъже или в първата или в последната третина на терена, а след това повторете търсенето на останалите две трети. Nonrecursive версия на трикомпонентни минимум търсенето се осъществява както следва:

,

Докато (високо-ниско)> Eps направя

{Ниско и високо - от лявата и дясната граница на сегмента за търсене

Eps - дава точност}

започвам

low3: = (2 * ниско + висока) / 3;

high3: = (ниско + 2 * високо) / 3;

ако F (low3)> F (high3) след това ниско: = low3

останало високо: = high3;

приключи;

Res: = (висок + нисък) / 2; {Резултати}

Когато всички променливи имат същия вид материал, и F (X) определя стойностите на unimodal функция.

Подобрен вариант трикомпонентен метод на търсене е златна точка, в която се изчислените стойности на функциите, използвани в следващата итерация.

<== Предишна лекция | На следващата лекция ==>
| Алгоритъм. Най-лесният начин да двойна линия през всички двойки с началните и крайните номера за всеки интервал и да намери сумата на числата

; Дата: 01.11.2014; ; Прегледи: 161; Нарушаването на авторските права? ;


Ние ценим Вашето мнение! Беше ли полезна публикуван материал? Да | не



ТЪРСЕНЕ:


Вижте също:



zdes-stroika.ru - Studopediya (2013 - 2017) на година. Тя не е автор на материали, и дава на студентите с безплатно образование и използва!
Page генерирана за: 0.039 сек.