If you're seeing this message, it means we're having trouble loading external resources on our website.

თუ ვებფილტრს იყენებთ, დარწმუნდით, რომ *.kastatic.org და *.kasandbox.org დომენები არ არის დაბლოკილი.

ძირითადი მასალა

ასიმპტოტური ჩანაწერი

აქამდე ჩვენ გავაანალიზეთ წრფივი ძებნა და ორობითი ძებნა ვარაუდების მაქსიმალური რაოდენობის დათვლით. მაგრამ რაც ნამდვილად გვაინტერესებს, არის რამდენი ხანი სჭირდება ამ ალგორითმების მუშაობას. ჩვენ გვაინტერესებს დრო და არა — მხოლოდ ვარაუდები. წრფივი ძებნისა და ორობითი ძებნის სამუშაო დროები მოიცავს დროს, რომელიც საჭიროა ვარაუდების გასაკეთებლად და შესამოწმებლად, მაგრამ სულ ეს არაა.
ალგორითმის სამუშაო დრო დამოკიდებულია იმაზე, თუ რამდენი ხანი სჭირდება კომპიუტერს ამ ალგორითმის კოდის ხაზების შესასრულებლად — და ეს დამოკიდებულია კომპიუტერის სიჩქარეზე, პროგრამირების ენაზე და კომპილატორზე, რომელიც პროგრამას თარგმნის პროგრამირების ენიდან კოდზე, რომელიც პირდაპირ კომპიუტერზე ეშვება, სხვა ფაქტორებთან ერთად.
მოდით, ფრთხილად დავფიქრდეთ ალგორითმის სამუშაო დროზე. შეგვიძლია, ორი იდეის კომბინაცია გამოვიყენოთ. პირველ ყოვლისა, ჩვენ უნდა გავარკვიოთ, რამდენი ხანი ესაჭიროება ალგორითმს შემომავალი მონაცემების ზომასთან მიმართებით. ეს იდეა ინტუიციურად სწორია, არა? უკვე ვნახეთ, რომ ვარაუდების მაქსიმალური რაოდენობა წრფივ ძებნაში და ორობით ძებნაში იზრდება, როცა მასივის სიგრძე იზრდება. ან იფიქრეთ GPS-ზე. თუ მხოლოდ შტატთაშორისი გზატკეცილების სისტემის შესახებ იცის და არ იცის ყველა პატარა-პატარა ქუჩა, უფრო სწრაფად უნდა იპოვოს ორ წერტილს შორის გზა, არა? ანუ, ალგორითმის სამუშაო დროზე ისევე ვფიქრობთ, როგორც მისი შემომავალი მონაცემების ზომის ფუნქციაზე.
მეორე იდეა არის შემდეგი: ყურადღება უნდა გავამახვილოთ იმაზე, თუ რამდენად სწრაფად იზრდება ფუნქცია მისი შემომავალი მონაცემების ზომის ზრდასთან ერთად. ამას ზრდის სიჩქარეს ვეძახით. ყველაფერი ძალიან რომ გავართულოთ, ფუნქცია უნდა გავამარტივოთ, რათა თვალ-ყური ვადევნოთ მეტად მნიშვნელოვან ნაწილს და მოვიშოროთ ნაკლებ მნიშვნელოვანი ნაწილები. მაგალითად, ვთქვათ, ალგორითმი, რომელიც n ზომის მქონე შემომავალ მონაცემებზე მუშაობს, იყენებს 6n2+100n+300 მანქანურ ინსტრუქციას. 6n2 ხდება უფრო დიდი, ვიდრე დანარჩენი წევრები, 100n+300, როგორც კი n ხდება საკმარისად დიდი, ამ შემთხვევაში - 20. აი, დიაგრამა, რომელიც გაჩვენებთ 6n2-სა და 100n+300-ს n-ის მნიშვნელობებისთვის 0-იდან 100-მდე:
ჩვენ ვიტყოდით, რომ ეს ალგორითმი მუშაობს n2 დროში, ვიშორებთ კოეფიციენტ 6-ს და დანარჩენ წევრებს: 100n+300. მნიშვნელობა არა აქვს, რა კოეფიციენტებს ვიყენებთ; თუ მუშაობის დრო არის an2+bn+c რიცხვებისთვის a>0, b და c, ყოველთვის იარსებებს ისეთი მნიშვნელობა n, რომლისთვისაც an2 არის მეტი, ვიდრე bn+c და ეს სხვაობა იზრდება, როცა n იზრდება. მაგალითად, აი, დიაგრამა, რომელზეც ნაჩვენებია 0.6n2-ისა და 1000n+3000-ის მნიშვნელობები, სადაც ჩვენ n2-ის კოეფიციენტი 10-ჯერ შევამცირეთ და დანარჩენი ორი კოეფიციენტი გავზარდეთ 10-ჯერ:
n-ის მნიშვნელობა, რომელზეც 0.6n2 ხდება უფრო დიდი, ვიდრე 1000n+3000, გაიზარდა, მაგრამ ასეთი გადაკვეთის წერტილი ყოველთვის იქნება, განურჩევლად იმისა, თუ რა შეზღუდვები გვაქვს.
მუდმივი კოეფიციენტებისა და ნაკლებად მნიშვნელოვანი წევრების მოშორებით შეგვიძლია ყურადღება გავამახვილოთ ალგორითმის მუშაობის დროის მნიშვნელოვან ნაწილზე — მისი ზრდის სიჩქარეზე — თან თავიდან ავირიდებთ ზედმეტ დეტალებში ჩასვლას, რომელიც აღქმას გვირთულებს. როდესაც ვიშორებთ მუდმივ კოეფიციენტებს და ნაკლებად მნიშვნელოვან წევრებს, შეგვიძლია, გამოვიყენოთ ასიმპტოტური ნოტაცია. მის სამნაირ ფორმას ვიხილავთ: big-Θ ნოტაცია, big-O ნოტაცია და big-Ω ნოტაცია.

ამ მასალის შინაარსი შექმნილია დარტმუთის კომპიუტერული მეცნიერების პროფესორების თომას კორმენისა და დევინ ბალკომის, ასევე ხანის აკადემიის კომპიუტერული ჯგუფის მიერ. მასალის ლიცენზიაა CC-BY-NC-SA.

გსურთ, შეუერთდეთ დისკუსიას?

პოსტები ჯერ არ არის.
გესმით ინგლისური? დააწკაპუნეთ აქ და გაეცანით განხილვას ხანის აკადემიის ინგლისურენოვან გვერდზე.