CodeBlanks Logo Icon CodeBlanks

Meydan okuma 3

Dışbükey zarfı yazdırırsın.

Meydan okuma 3 - Dışbükey zarf

Üçüncü meydan okuma, dışbükey zarf algoritmasını yoklar. Andrew monoton zincir yöntemiyle nokta kümesinin zarfını hesaplar.

count_doublings ve kmp_search fonksiyonları yukarıda hazırdır; sen convex_hull yazacaksın. Önce noktaları sırala, sonra alt ve üst zarfı kur.

Bu meydan okuma, birikimli zincirin üçüncü halkasıdır.

Uygulama convex_hull fonksiyonu

convex_hull(points) yaz. Nokta listesinin dışbükey zarfını saat yönünün tersine döndür. print(convex_hull([(0,0), (4,0), (4,3), (0,3), (2,1)])) ile [(0, 0), (4, 0), (4, 3), (0, 3)] yazdır. count_doublings ve kmp_search yukarıda hazırdır.

Başlangıç kodu

solution.py
def count_doublings(n):
    count = 0
    size = 1
    last = 0
    for i in range(n):
        if last == size:
            size *= 2
            count += 1
        last += 1
    return count

def kmp_search(text, pattern):
    n, m = len(text), len(pattern)
    lps = [0] * m
    length = 0
    i = 1
    while i < m:
        if pattern[i] == pattern[length]:
            length += 1
            lps[i] = length
            i += 1
        elif length != 0:
            length = lps[length - 1]
        else:
            lps[i] = 0
            i += 1
    i = j = 0
    while i < n:
        if text[i] == pattern[j]:
            i += 1
            j += 1
            if j == m:
                return i - j
        elif j != 0:
            j = lps[j - 1]
        else:
            i += 1
    return -1

def convex_hull(points):
    # Dışbükey zarfı döndür

Örnek çözüm

solution.py
def convex_hull(points):
    pts = sorted(set(points))
    if len(pts) <= 1:
        return pts
    def cross(o, a, b):
        return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0])
    lower = []
    for p in pts:
        while len(lower) >= 2 and cross(lower[-2], lower[-1], p) <= 0:
            lower.pop()
        lower.append(p)
    upper = []
    for p in reversed(pts):
        while len(upper) >= 2 and cross(upper[-2], upper[-1], p) <= 0:
            upper.pop()
        upper.append(p)
    return lower[:-1] + upper[:-1]
print(convex_hull([(0,0), (4,0), (4,3), (0,3), (2,1)]))

Beklenen çıktı

[(0, 0), (4, 0), (4, 3), (0, 3)]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Convex hull kavramları

Kavram Anlamı
monoton zincir Andrew yöntemi
sıralama İlk adım
alt zarf Soldan sağa
üst zarf Sağdan sola

2 çapraz çarpım

Soru
return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[____]) * (b[0] - o[0])
Cevap
return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0])

Açıklama: a[1] - o[1] y bileşenidir.

3 Dışbükey zarf hangi yöntemle kurulur?

  • Sıralı tarama
  • DFS
  • Monoton zincir Doğru cevap
  • Greedy

Açıklama: Monoton zincir (Andrew) yöntemi kullanılır.

Uzman seviye bölümündeki tüm dersler