ترانهادهی سریع ماتریس خلوت
ماتریس خلوت را بهصورت سهتاییهای (سطر، ستون، مقدار) نگه میدارد و ترانهادهاش را بدون مرتبسازی، با شمردن جملههای هر ستون، در O(ستونها + جملهها) میسازد.
ماتریسی که بیشتر خانههایش صفر است (خلوت) را بهتر است فقط با جملههای ناصفرش نگه داشت: فهرستی از سهتاییهای (سطر، ستون، مقدار) که سطر به سطر مرتباند.
- زمان:
O(cols + terms) - حافظه:
O(cols + terms) - هوروویتز–ساهنی، فصل ۲
ماتریس ۶×۶ با ۸ جملهی ناصفر؛ ترانهاده با دو گذر روی جملهها ساخته میشود.
def fast_transpose(A):rows, cols = len(A), len(A[0])# The sparse form: one (row, column, value) triple per non-zero, row by row.terms = [(i, j, A[i][j]) for i in range(rows) for j in range(cols) if A[i][j] != 0]# 1. How many terms each column has, and where its block starts in the result.row_terms = [0] * colsfor _, j, _ in terms:row_terms[j] = row_terms[j] + 1start = [0] * colsfor j in range(1, cols):start[j] = start[j - 1] + row_terms[j - 1]# 2. Drop each term straight into its place, swapping row and column.b = [None] * len(terms)for i, j, v in terms:b[start[j]] = (j, i, v)start[j] = start[j] + 1return b
شروع اجرا
terms
جدول هنوز خالی است.
b
جدول هنوز خالی است.
متغیرهای محلی
نارنجی = در همین گام عوض شد
A list
Call stack
- fast_transpose()خط 1
توضیح
ایده
ماتریسی که بیشتر خانههایش صفر است (خلوت) را بهتر است فقط با جملههای ناصفرش نگه داشت: فهرستی از سهتاییهای (سطر، ستون، مقدار) که سطر به سطر مرتباند.
ترانهادهی سریع
ترانهاده یعنی هر (i, j, v) بشود (j, i, v)؛ ولی نتیجه هم باید سطر به سطر (یعنی بر اساس j) مرتب باشد. بهجای مرتب کردن:
- بشمار هر ستون
jچند جمله دارد. - با جمع پیشوندی،
start[j]را حساب کن: بلوک ستونjدر نتیجه از کجا شروع میشود. - هر سهتایی را مستقیم در
start[j]بگذار وstart[j]را یکی جلو ببر.
هزینه
O(ستونها + جملهها)، در برابر O(ستونها × جملهها) در روش سادهای که برای هر ستون کل فهرست را میگردد. (همان ایدهی مرتبسازی شمارشی.)
در trace به چه چیزی نگاه کنی
- جدول
termsسهتاییهای ورودی وbترانهاده است که خانه به خانه پر میشود.