Bölüm 5: Polinomlar ve Seyrek Matrisler
Ç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?
A = P[0..2], B = P[3..6]. Sonuç avail = 7'den yazılır: *sd = 7.
(6, 6) eşit: c = 2 + 1 = 3 → P[7] = 3x⁶; ikisi de ilerler.
(3, 3) eşit: c = 5 − 5 = 0 → eklenmez.
(1, 2): B'nin üssü büyük → 3x² eklenir, yalnız sb ilerler.
(1, 0): A'nın üssü büyük → −x eklenir. sa = 3 > fa: döngü biter.
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?
Sonuç boş: x · x² = x³ ilk düğüm olur; rBas = r = bas.
x · (−2x) = −2x²: yerlestir 2 üslü terim bulamaz, r'nin peşine ekler.
x · 4 = 4x eklenir. r, −2x²'de kalır.
p = 2, arama bas'tan (x³) başlar. 2 · x² = 2x²: katsayı −2 + 2 = 0 → SonrakiTerimiSil.
2 · (−2x) = −4x: 4 − 4 = 0, bu düğüm de silinir.
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
| row | col | value | |
|---|---|---|---|
| M[0] | 3 | 5 | 5 |
| M[1] | 0 | 1 | 4 |
| M[2] | 0 | 4 | 7 |
| M[3] | 1 | 0 | 2 |
| M[4] | 1 | 4 | 1 |
| M[5] | 2 | 1 | 9 |
Üç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?
Her sütundaki terim sayısı: sütun 1 ve 4'te ikişer, 2 ve 3 boş.
Önek toplamları: boş sütunlar 2 ve 3 de 4'ten başlar.
Sütun 1 → j = start_pos[1]++ = 2: önce okunur, sonra artırılır.
Sütun 4 → T[4].
Sütun 0 → T[1].
Sütun 4'ün ikinci terimi → T[5].
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 k | toplam |
|---|---|---|
| 0 · 0 | — | 0 |
| 0 · 1 | k = 0, 2 | 2·4 + 1·2 = 10 |
| 0 · 2 | k = 2 | 1·6 = 6 |
| 1 · 0 | k = 1 | 3·1 = 3 |
| 2 · 1 | k = 0 | 5·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.