DP და greedy ორივე საჭიროებს ოპტიმალური ქვესტრუქტურას. განსხვავება: greedy ასევე მოითხოვს greedy-choice property-ს (ლოკალური ოპტიმუმი გლობალურად ოპტიმალურია), ხოლო DP საჭიროა როდესაც უნდა განიხილოთ მრავალი ვარიანტი და გადაფარული ქვესამცალკეები.
DP და greedy ორივე საჭიროებს ოპტიმალური ქვესტრუქტურას. განსხვავება: greedy ასევე მოითხოვს greedy-choice property-ს (ლოკალური ოპტიმუმი გლობალურად ოპტიმალურია), ხოლო DP საჭიროა როდესაც უნდა განიხილოთ მრავალი ვარიანტი და გადაფარული ქვესამცალკეები.
Optimal substructure? -- both need this
+ greedy-choice property holds? -> GREEDY (fast, one pass of choices)
+ must compare many sub-solutions / they overlap? -> DYNAMIC PROGRAMMING
# Greedy FAILS for coins {1,3,4}, amount 6 -> 4+1+1 (3 coins)
# DP finds the true optimum: 3+3 (2 coins)
def min_coins(amount, coins):
INF = float('inf')
dp = [0] + [INF] * amount
for a in range(1, amount + 1):
for c in coins:
if c <= a:
dp[a] = min(dp[a], dp[a - c] + 1) # try every coin
return dp[amount]
min_coins(6, [1, 3, 4]) # -> 2
Greedy ერთ ვარიანტს ვალდებული ხდის; DP ყველა გამოკვლევას და საუკეთესოს ინახავს.
Greedy ჩვეულებრივ O(n log n); DP უფრო მეტ დროს/მეხსიერებას (ხშირად O(n·m)) ითხოვს სიზუსტის ნაცვლად.
greedy-ის გამოყენება მისი თვისების დამტკიცების გარეშე იძლევა ცდომილებულ პასუხებს რომელიც მცირე ტესტებს აბარებს. ეჭვის შემთხვევაში, აირჩიეთ DP ან დაამოწმეთ greedy brute force-ის წინააღმდეგ.
Greedy-ის არჩევა როდესაც ის ვალიდურია უზარმაზარ დროს გარდაქმნის; მისი არჩევა როდესაც ის არ არის ქმნის ჩალიჩი ბაგებს.
კიდეგი რომელი პარადიგმა შეესაბამება — და შეძლოთ მის დამტკიცება — ეს უფროსი დონის განსხვავებაა.
იცავს DP-ით გადამეტებისა და მტკიცე გარეშე greedy არჩევის ქვედა მიწოდებიდან.
IT გასაუბრების კითხვების ბიბლიოთეკა დეტალური პასუხებით — Junior-დან Senior-მდე.
შემოწირულობა