Bölüm 5: Polinomlar ve Seyrek Matrisler

C ile Veri Yapıları ve Algoritmalar · Çalışma Soruları
Polinom gösterimipaddBağlı liste ile çarpımÜçlü gösterimfast_transposeSeyrek çarpımCSR
Sercan KÜLCÜ

Çoktan Seçmeli · Polinom ADT ve Gösterim

Soru 1: İki Gösterim

A(x) = x¹⁰⁰⁰ + 1 polinomu saklanacak. Katsayı dizisi gösteriminde (coef[MAX_DEGREE]) ve terim dizisi gösteriminde ({coef, expon} çiftleri) en az kaç sayı tutulur (degree alanı hariç)?

D: Katsayı dizisinde x⁰ … x¹⁰⁰⁰ için 1001 katsayı gerekir; 999'u sıfırdır. Terim dizisinde yalnız sıfır olmayan 2 terim vardır, her biri bir katsayı ve bir üs: 4 sayı. Seyrek polinomda terim dizisi büyük kazanç sağlar; tüm katsayıları dolu bir polinomda ise iki kat yer tutar.

Çoktan Seçmeli · Polinom Toplama

Soru 2: padd Sonucu

A = 3x⁵ + 2x² + 1 ve B = 4x⁴ − 2x² + 6x, P dizisinde sıralı tutuluyor. padd sonucu D nedir ve kaç attach çağrısı yapılır?

A: Karşılaştırmalar (5, 4) → A'nın 3x⁵; (2, 4) → B'nin 4x⁴; (2, 2) → 2 − 2 = 0, eklenmez; (0, 1) → B'nin 6x. B biter, A'dan 1 kopyalanır: 4 attach. B toplamı 0 olan terimi de ekler; D farklı üsleri toplar.

Adım Adım Çalıştırma · Polinom Toplama

Soru 3: padd'i İzlemek

A = 2x⁶ + 5x³ − x ve B = x⁶ − 5x³ + 3x² + 4 için padd(0, 2, 3, 6, &sd, &fd) P dizisine hangi terimleri yazar?

2x⁶05x³1−x2x⁶3−5x³43x²54678910ABDsasb

A = P[0..2], B = P[3..6]. Sonuç avail = 7'den yazılır: *sd = 7.

2x⁶05x³1−x2x⁶3−5x³43x²5463x⁶78910ABDsasb

(6, 6) eşit: c = 2 + 1 = 3 → P[7] = 3x⁶; ikisi de ilerler.

2x⁶05x³1−x2x⁶3−5x³43x²5463x⁶78910ABDsasb

(3, 3) eşit: c = 5 − 5 = 0 → eklenmez.

2x⁶05x³1−x2x⁶3−5x³43x²5463x⁶73x²8910ABDsasb

(1, 2): B'nin üssü büyük → 3x² eklenir, yalnız sb ilerler.

2x⁶05x³1−x2x⁶3−5x³43x²5463x⁶73x²8−x910ABDsb

(1, 0): A'nın üssü büyük → −x eklenir. sa = 3 > fa: döngü biter.

2x⁶05x³1−x2x⁶3−5x³43x²5463x⁶73x²8−x9410ABD

B'de kalan 4 kopyalanır. D = P[7..10] = 3x⁶ + 3x² − x + 4: 4 tur, 4 attach, O(n + m).

void padd(int sa, int fa, int sb, int fb,
          int *sd, int *fd) {
  float c; *sd = avail;
  while (sa <= fa && sb <= fb)
    switch (COMPARE(P[sa].expon,
                    P[sb].expon)) {
    case -1: EK(sb); sb++; break;
    case  1: EK(sa); sa++; break;
    case  0: c = P[sa].coef + P[sb].coef;
      if (c) attach(c, P[sa].expon);
      sa++; sb++;
    }
  for (; sa <= fa; sa++) EK(sa);
  for (; sb <= fb; sb++) EK(sb);
  *fd = avail - 1;
}

Çıktı Sorusu · Polinom Toplama

Soru 4: Kırpılan Katsayı

attach yanlışlıkla void attach(int coef, int expon) olarak yazılmış. A = 2,5x² + 0,5x ve B = 1,5x² + 1 (float katsayılar) padd ile toplanırsa D nedir?

Cevabı göster

D = 4x² + 0x + 1 (3 terim).

  • (2, 2) eşit: c = 2,5 + 1,5 = 4,0 → attach(4, 2): doğru, çünkü toplam tam sayı.
  • (1, 0): A büyük → EK, 0,5'i int parametreye geçirir: 0'a kırpılır. Sonuca katsayısı 0 olan bir terim girer.
  • B'den 1 kopyalanır.

Doğru sonuç 4x² + 0,5x + 1'dir. Sıfır katsayılı terim ayrıca polinomun “yalnız sıfır olmayan terimler” değişmezini bozar. Parametre float olmalıdır.

Çoktan Seçmeli · Polinom Toplama

Soru 5: Ortak Dizide Taşma

MAX_TERMS = 101 ve avail = 95. Hiç ortak üssü olmayan 4 ve 5 terimli iki polinom padd ile toplanıyor. Kaçıncı attach çağrısı taşma iletisi verir?

B: Ortak üs yoksa 4 + 5 = 9 attach gerekir. Boş konumlar 95–100: 6 attach sığar; 7. çağrıda avail = 101 ≥ MAX_TERMS olur. Eski polinomların yeri hiç geri kazanılmadığından ortak P dizisi sıkıştırma ister; bağlı liste bu sorunu ortadan kaldırır.

Hata Bulma · Bağlı Liste ile Polinom

Soru 6: Önce free, Sonra Bağ

SonrakiTerimiSil aşağıdaki gibi kısaltılmış. Ne yanlış gider? Doğru sıra nedir?

void SonrakiTerimiSil(
        pol_gosterge Onceki) {
  free(Onceki->bag);
  Onceki->bag = Onceki->bag->bag;
}
Cevabı göster

İkinci satır Onceki->bag->bag'i okur, ama Onceki->bag az önce free edildi: bırakılmış düğümün alanı okunur (tanımsız davranış). Çoğu zaman eski değer hâlâ oradadır ve kod çalışıyor gibi görünür.

void SonrakiTerimiSil(
        pol_gosterge Onceki) {
  pol_gosterge Silinecek =
        Onceki->bag;
  if (!Silinecek) return;
  Onceki->bag = Silinecek->bag;
  free(Silinecek);   /* en son */
}

Ayrıca silinecek düğüm yoksa (Onceki->bag == NULL) kısaltılmış sürüm NULL->bag'e erişir.

Adım Adım Çalıştırma · Bağlı Liste ile Polinom

Soru 7: PolCarp ile İki Silme

PolCarp (x + 2) ile (x² − 2x + 4) listelerini çarpıyor. Sonuç listesi her çarpımdan sonra nasıl değişir?

x³rBas,r,bas

Sonuç boş: x · x² = x³ ilk düğüm olur; rBas = r = bas.

x³−2x²rBas,r,bas

x · (−2x) = −2x²: yerlestir 2 üslü terim bulamaz, r'nin peşine ekler.

x³−2x²4xrrBas,bas

x · 4 = 4x eklenir. r, −2x²'de kalır.

x³4xrBas,r,bas−2x² + 2x² = 0 → silindi

p = 2, arama bas'tan (x³) başlar. 2 · x² = 2x²: katsayı −2 + 2 = 0 → SonrakiTerimiSil.

x³rBas,r,bas4x − 4x = 0 → silindi

2 · (−2x) = −4x: 4 − 4 = 0, bu düğüm de silinir.

x³8rBas,r,bas

2 · 4 = 8 eklenir. Sonuç x³ + 8: n·m = 6 çarpım, 2 silme.

pol_gosterge PolCarp(pol_gosterge pBas,
                     pol_gosterge qBas) {
  pol_gosterge p, q, r = NULL;
  pol_gosterge bas = NULL, rBas = NULL;
  for (p = pBas; p; p = p->bag) {
    r = bas;
    for (q = qBas; q; q = q->bag) {
      int us = p->us + q->us;
      int kat = p->katsayi * q->katsayi;
      if (rBas) r = yerlestir(r, us, kat);
      else rBas = r = bas =
             YeniTerimEkle(us, kat, NULL);
      if (q == qBas) bas = r;
    }
  }
  return rBas;
}

Çoktan Seçmeli · Bağlı Liste ile Polinom

Soru 8: Çarpım Yöntemleri

A n, B m terimli. A'nın her terimi için B ile çarpımdan ayrı bir sıralı liste kurulup bu n liste en sonda ikişer ikişer birleştiriliyor. Karmaşıklık nedir?

B: n listenin her biri en çok m terimlidir; ikişer ikişer birleştirmede her düzeyde toplam en çok n·m terim işlenir ve lg n düzey vardır: O(m·n·lg n). C, her listeyi sonuçla art arda birleştirmenin bedelidir (ara sonuç büyüdükçe pahalılaşır); A her terimi baştan tarayarak eklemektir. Düzey sayısını liste sayısı n belirler, m değil.

Çoktan Seçmeli · Seyrek Matris

Soru 9: Üçlü Gösterim Ne Zaman Kazandırır?

10 × 10 tamsayı matrisi ⟨row, col, value⟩ üçlüleriyle ve M[0] başlığıyla tutuluyor. Sıfırdan farklı öğe sayısı t en çok kaç iken üçlü gösterim 2B diziden az yer kaplar?

C: Üçlüler 3(t + 1) tamsayı tutar; 3(t + 1) < 100 ⇔ t + 1 ≤ 33 ⇔ t ≤ 32. t = 33'te 102 > 100 olur. Kabaca matrisin üçte birinden azı doluysa kazançlıdır; başlık satırı (+1) unutulursa A bulunur.

Klasik Soru · Seyrek Matris

Soru 10: Üçlülere Çevirmek

Aşağıdaki 3 × 5 matrisin üçlü tablosunu (M[0] dâhil) yazınız. Bu matris için üçlü gösterim bellek kazandırır mı?

     0  1  2  3  4
0: [ 0  4  0  0  7 ]
1: [ 2  0  0  0  1 ]
2: [ 0  9  0  0  0 ]
Cevabı göster
rowcolvalue
M[0]355
M[1]014
M[2]047
M[3]102
M[4]141
M[5]219

Üçlüler önce satıra, sonra sütuna göre sıralıdır; M[0] satır sayısı, sütun sayısı ve terim sayısıdır.

Bellek: 3 · (5 + 1) = 18 tamsayı, 2B dizi 15 tamsayı. 15 hücrenin 5'i (üçte biri) dolu olduğundan üçlü gösterim burada kazandırmaz.

Adım Adım Çalıştırma · Transpoz Alma

Soru 11: fast_transpose İzleme

Önceki sorudaki 3 × 5 matrisin üçlüleri fast_transpose'a veriliyor. row_terms, start_pos ve T nasıl dolar?

row_termsstart_pos1021020324T[0](5, 3, 5)[1][2][3][4][5]

Her sütundaki terim sayısı: sütun 1 ve 4'te ikişer, 2 ve 3 boş.

row_termsstart_pos110221042043244T[0](5, 3, 5)[1][2][3][4][5]

Önek toplamları: boş sütunlar 2 ve 3 de 4'ten başlar.

row_termsstart_pos110231042043244T[0](5, 3, 5)[1][2](1, 0, 4)[3][4][5]

Sütun 1 → j = start_pos[1]++ = 2: önce okunur, sonra artırılır.

row_termsstart_pos110231042043254T[0](5, 3, 5)[1][2](1, 0, 4)[3][4](4, 0, 7)[5]

Sütun 4 → T[4].

row_termsstart_pos120231042043254T[0](5, 3, 5)[1](0, 1, 2)[2](1, 0, 4)[3][4](4, 0, 7)[5]

Sütun 0 → T[1].

row_termsstart_pos120231042043264T[0](5, 3, 5)[1](0, 1, 2)[2](1, 0, 4)[3][4](4, 0, 7)[5](4, 1, 1)

Sütun 4'ün ikinci terimi → T[5].

row_termsstart_pos120241042043264T[0](5, 3, 5)[1](0, 1, 2)[2](1, 0, 4)[3](1, 2, 9)[4](4, 0, 7)[5](4, 1, 1)

Sütun 1'in ikinci terimi → T[3]. T satır sırasına göre sıralı: M bir kez tarandı, O(cols + terms).

void fast_transpose(term M[], term T[]) {
  int i, j, nc = M[0].col;
  int nt = M[0].value;
  int row_terms[MAX_COL], start_pos[MAX_COL];
  T[0].row = nc;  T[0].col = M[0].row;
  T[0].value = nt;
  if (nt <= 0) return;
  for (i = 0; i < nc; i++) row_terms[i] = 0;
  for (i = 1; i <= nt; i++)
    row_terms[M[i].col]++;
  start_pos[0] = 1;
  for (i = 1; i < nc; i++)
    start_pos[i] = start_pos[i-1]
                 + row_terms[i-1];
  for (i = 1; i <= nt; i++) {
    j = start_pos[M[i].col]++;
    T[j].row = M[i].col;
    T[j].col = M[i].row;
    T[j].value = M[i].value;
  }
}

Çoktan Seçmeli · Transpoz Alma

Soru 12: transpose'un Bedeli

1000 × 1000 bir matriste 2000 sıfır olmayan öğe var. Sunumdaki yavaş transpose'ta M[j].col == i karşılaştırması kaç kez yapılır?

D: Dış döngü her sütun (1000) için iç döngüde bütün terimleri (2000) tarar: 1000 · 2000 = 2 000 000. fast_transpose ise iki sütun ve iki terim taramasıyla yaklaşık 2 · 2000 + 2 · 1000 = 6000 işlemde biter. 2B dizide transpoz 10⁶ hücre gezerdi.

Çoktan Seçmeli · Transpoz Alma

Soru 13: Ön Ek mi, Son Ek mi?

fast_transpose'ta j = start_pos[M[i].col]++; yerine j = ++start_pos[M[i].col]; yazılırsa ne olur?

A: Ön ek önce artırır: her terim doğru yerinin bir sağına yazılır. Sütunlar çakışmaz, hepsi bir kayar: T[1] boş kalır ve son terim T[t + 1]'e taşar (önceki matriste T[2]…T[6]). Dizi tam t + 1 boyutluysa bu yazma sınırın dışındadır.

Klasik Soru · Seyrek Matris Çarpımı

Soru 14: Seyrek Çarpım

A ve B 3 × 3, üçlüleri aşağıda. smult(a, bt, d) (bt, B'nin transpozu) D'nin hangi üçlülerini üretir? carp kaç kez çağrılır?

A: (0,0,2) (0,2,1) (1,1,3) (2,0,5)
B: (0,1,4) (1,0,1) (2,1,2) (2,2,6)
Cevabı göster

Bᵀ satırları (B'nin sütunları): 0: (0, 1, 1) · 1: (1, 0, 4), (1, 2, 2) · 2: (2, 2, 6).

A satırı · Bᵀ satırıortak ktoplam
0 · 0—0
0 · 1k = 0, 22·4 + 1·2 = 10
0 · 2k = 21·6 = 6
1 · 0k = 13·1 = 3
2 · 1k = 05·4 = 20

D: (0, 1, 10), (0, 2, 6), (1, 0, 3), (2, 1, 20), başlık (3, 3, 4). Diğer çiftler 0 verir ve saklanmaz. A'nın 3 satırı × Bᵀ'nin 3 satırı = 9 carp çağrısı.

Çoktan Seçmeli · Seyrek Matris Çarpımı

Soru 15: Neden Önce Bᵀ?

Seyrek matris çarpımında (D = A · B) neden önce B'nin transpozu alınır?

C: dij için A'nın i. satırı ile B'nin j. sütunu gerekir. Satır öncelikli üçlülerde A'nın satırı ardışıktır ama B'nin sütunu dağınıktır; Bᵀ'de bu sütun ardışık bir satır olur ve carp, padd gibi iki işaretçiyle col alanına göre birleştirir. Sonuç seyrek olmak zorunda değildir.

Klasik Soru · Diğer Gösterimler

Soru 16: CSR ile Matris–Vektör Çarpımı

4 × 4 matris CSR biçiminde: val = {3, 1, 4, 2, 5, 6}, col_ind = {0, 3, 1, 0, 2, 3}, row_ptr = {0, 2, 3, 3, 6}. Matrisin satırları nedir? x = (1, 2, 3, 4) için sunumdaki döngü y'yi ne hesaplar?

for (i = 0; i < rows; i++) {
  y[i] = 0;
  for (k = row_ptr[i];
       k < row_ptr[i+1]; k++)
    y[i] += val[k] * x[col_ind[k]];
}
Cevabı göster
  • Satır 0: val[0..1] → a00 = 3, a03 = 1.
  • Satır 1: val[2] → a11 = 4.
  • Satır 2: row_ptr[2] = row_ptr[3] = 3 → boş satır, iç döngü hiç dönmez.
  • Satır 3: val[3..5] → a30 = 2, a32 = 5, a33 = 6.

y = (3·1 + 1·4, 4·2, 0, 2·1 + 5·3 + 6·4) = (7, 8, 0, 41).

Bellek 6 + 6 + 5 = 17 tamsayı (üçlülerde 21). İş O(rows + terms): her terim bir kez çarpılır. row_ptr, fast_transpose'taki start_pos gibi bir önek toplamıdır.

Son

Bölüm 5: Polinomlar ve Seyrek Matrisler — Çalışma Soruları
Konu anlatımı: Polinomlar ve seyrek matrisler sunumu · Ders notu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.