ხარბი იდეა და როდის ცდება

ერთი საკონფერენციო ოთახი, ერთი დღე, ოცი ჯავშნის მოთხოვნა: რომელი დავადასტუროთ, რომ რაც შეიძლება მეტი შეხვედრა დავიტიოთ? ამას ერთი მარტივი წესი იდეალურად წყვეტს, თითქმის იგივე წესი მონეტებისთვის კი ცდება. მთელი ხელოვნება იმის გარჩევაა, როდის რომელია.

საშუალო⏱ 12 წთ
01

ისწავლე

იდეა, მექანიზმი და ფასი.

01ხარბი იდეა

ხარბი ალგორითმი პასუხს ნაბიჯ-ნაბიჯ აგებს და ყოველ ნაბიჯზე იმ ვარიანტს იღებს, რომელიც ამ წამს საუკეთესოდ გამოიყურება. გადაფიქრება არ იცის: გაკეთებული არჩევანი საბოლოოა.

ამიტომ ხარბი ალგორითმები მოკლე და სწრაფია, ჩვეულებრივ ერთი სორტირება და ერთი გავლა, O(n log n). მახე ისაა, რომ „ახლა საუკეთესო“ ყოველთვის „საერთოდ საუკეთესო“ არ არის. ხარბი ალგორითმი სწორია მხოლოდ მაშინ, როცა ორი პირობა სრულდება:

  • ხარბი არჩევანის თვისება: არსებობს ოპტიმალური პასუხი, რომელიც ხარბი არჩევანით იწყება.
  • ოპტიმალურობის თვისება ქვეამოცანებისთვის: ამ არჩევანის შემდეგ დარჩენილი იგივე ამოცანის უფრო პატარა ვერსიაა.

ე.ი. ხარბი არასდროს არის „თავისთავად სწორი“. ირჩევ წესს და ან ამტკიცებ, ან კონტრმაგალითით ამტყუნებ.

ყოველ ნაბიჯზე: უდიდესი ახლავენაბიჯი 1753ნაბიჯი 2492ნაბიჯი 3618უკან დაბრუნება არ არისერთი გავლა, არანაირი გადარჩევა

02აქტივობების არჩევა: დალაგება დასრულების დროით

გვაქვს აქტივობები [დასაწყისი, დასასრული) და ერთი ოთახი. უნდა ავირჩიოთ რაც შეიძლება მეტი ისე, რომ არცერთი ორი ერთმანეთს არ გადაეფაროს.

სწორი წესი: დავალაგოთ დასრულების დროით, გავუყვეთ სიას და ავიღოთ ყოველი აქტივობა, რომელიც ბოლო აღებულის დასრულებისას ან მის შემდეგ იწყება. ინტუიცია: ყველაზე ადრე დამთავრებული აქტივობა დანარჩენებს ყველაზე მეტ დროს უტოვებს.

ქვემოთ მოცემულ რვა აქტივობაზე ეს წესი ტოვებს [1,4], [5,7], [8,11]: სამ შეხვედრას, და ოთხი ვერცერთ განრიგში ვერ ეტევა. მთელი ალგორითმი არის სორტირება და ერთი გავლა ერთადერთი ცვლადით, lastEnd.

დალაგებულია დასრულების დროით01234567891011[1,4][3,5][0,6][5,7][3,9][5,9][6,10][8,11]ავიღეთგამოვტოვეთ (გადაფარვა)
წყვეტილი ხაზები: ბოლო აღებული აქტივობის დასრულების დრო.

03რატომ არის სწორი: გაცვლის არგუმენტი

ავიღოთ ნებისმიერი ოპტიმალური განრიგი და შევხედოთ მის პირველ აქტივობას o₁. ხარბის პირველი არჩევანი g ყველაზე ადრე მთავრდება, ამიტომ end(g) ≤ end(o₁). ჩავანაცვლოთ o₁ g-ით: რაც o₁-ის შემდეგ იყო, g-ს ვერ გადაეფარება, რაოდენობა არ იცვლება, ესე იგი ახალი განრიგიც ოპტიმალურია და უკვე ხარბი არჩევანით იწყება.

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

გაცვლის არგუმენტი ხარბი წესის დამტკიცების სტანდარტული ხერხია: აჩვენე, რომ ხარბი არჩევანის ოპტიმალურ ამოხსნაში ჩასმა მას არ აუარესებს. სხვა „ბუნებრივი“ წესები ამ ტესტს ვერ აბარებს: „ჯერ ადრე დაწყებული“ ერთ გრძელ აქტივობას ებლანდება, „ჯერ უმოკლესი“ კი მოკლეს, რომელიც ორ სხვას ეფარება.

ხარბის პირველიgნებისმიერი ოპტიმალურიo₁o₂o₃გაცვლის შემდეგgo₂o₃g ადრე მთავრდება → ადგილი არ იკლებსიგივე რაოდენობა, გადაფარვა არ არის ✓

04როცა ხარბი ცდება: მონეტები {1, 3, 4}

ხურდის დაბრუნება რაც შეიძლება ცოტა მონეტით: აშკარა ხარბი წესია ჯერ უდიდესი მონეტა. ნამდვილი ფულით (1, 2, 5, 10, …) ის ყოველთვის ოპტიმალურია. ახლა ავიღოთ მონეტები {1, 3, 4} და თანხა 6:

  • ხარბი იღებს 4-ს, მერე 1-ს და კიდევ 1-ს: 3 მონეტა;
  • მაგრამ 3 + 3 = 6 მხოლოდ 2 მონეტაა.

4-ის აღება წინსვლად ჩანდა, მაგრამ დატოვა ნაშთი (2), რომლის გადახდაც მხოლოდ პატარა მონეტებით შეიძლება. ამ მონეტების სისტემაზე ხარბი არჩევანის თვისება უბრალოდ არ სრულდება და მას ვერანაირი დამტკიცება ვერ გადაარჩენს.

დასკვნა: სანამ ხარბ წესს ენდობი, პატარა კონტრმაგალითები სცადე. როცა ხარბი ცდება, დინამიური პროგრამირება (ეტაპი 10) ყოველი ქვეთანხისთვის ყველა ვარიანტს განიხილავს და ზუსტ ოპტიმუმს პოულობს. სწორედ ეს მაგალითი იქ დაბრუნდება.

მონეტები {1, 3, 4}, თანხა 6ხარბი: ჯერ უდიდესი4+1+13 მონეტა ✗ოპტიმუმი3+32 მონეტა ✓

ფასი ერთი შეხედვით

აქტივობების არჩევა (სორტირება + გავლა)O(n log n)
გავლა სორტირების შემდეგO(n)
ხარბი ხურდა, k სახის მონეტაO(k + coins used)

დაიმახსოვრე

  1. ხარბი ყოველ ნაბიჯზე ლოკალურად საუკეთესოს იღებს და აღარ აუქმებს, ამიტომ სწრაფია, მაგრამ თავისთავად სწორი არ არის.
  2. აქტივობების არჩევაში დასრულების დროით დალაგება დამტკიცებულად ოპტიმალურია, დამტკიცების ხერხი კი გაცვლის არგუმენტია.
  3. ერთი კონტრმაგალითიც, მაგ. მონეტები {1,3,4} და თანხა 6, საკმარისია ხარბი წესის დასამხობად; მაშინ დპ-ს მიმართე.
02

ითამაშე

გაიარე ალგორითმი ბიჯ-ბიჯ, მერე სცადე შენს მონაცემებზე.

👀 რას უყურო: უყურე წყვეტილ ხაზს (ბოლო დასრულების დრო): აქტივობა მხოლოდ მაშინ აიღება, თუ მის შემდეგ იწყება. მერე ნახე, როგორ მარცხდება ხარბი მონეტებზე.

ინტერაქტიული ვიზუალიზატორიაქ დააწკაპე, მერე space ← →
✎ შენი მონაცემებიმაქსიმუმ 10 აქტივობა (დრო 0–24). სცადე მონეტები 6 4 1 და თანხა 8, ან 25 10 5 1, სადაც ხარბი ყოველთვის მართალია.

აქტივობების არჩევა (დალაგებულია დასრულების დროით)

0246810[1,4][3,5][0,6][5,7][3,9][5,9][6,10][8,11]
ხარბი ალგორითმი ლოკალურად საუკეთესო არჩევანს აკეთებს და უკან არ იხედება. აქტივობების არჩევა: ავირჩიოთ რაც შეიძლება მეტი ერთმანეთთან გადაუფარავი აქტივობა. მთავარი ნაბიჯი: დალაგება დასრულების დროით.

ფსევდოკოდი

 1 activity selection: sort by finish time 2   take an activity if it starts after the last taken finishes 3   (greedy choice is provably optimal here) 4 coin change greedy: repeatedly take the largest coin ≤ remainder 5   … not always optimal (e.g. coins {1,3,4}, amount 6) 6 compare with the true optimum (found by DP)
1 / 1
03

შეამოწმე

სამი კითხვა. აირჩიე პასუხი და ნახე ახსნა.

№1

აქტივობები [1,10], [2,3], [4,5], [6,7]. რამდენს აირჩევს ხარბი „ჯერ ყველაზე ადრე დამთავრებული“?

№2

მონეტები {1, 5, 6, 9}, თანხა 11. რას დააბრუნებს „ჯერ უდიდესი მონეტა“?

№3

რას ამტკიცებს გაცვლის არგუმენტი?

04

ივარჯიშე

რეალური ამოცანები გასამყარებლად, მარტივიდან რთულისკენ.