AlgoVerse

ترانهاده‌ی سریع ماتریس خلوت

ماتریس خلوت را به‌صورت سه‌تایی‌های (سطر، ستون، مقدار) نگه می‌دارد و ترانهاده‌اش را بدون مرتب‌سازی، با شمردن جمله‌های هر ستون، در O(ستون‌ها + جمله‌ها) می‌سازد.

ماتریسی که بیشتر خانه‌هایش صفر است (خلوت) را بهتر است فقط با جمله‌های ناصفرش نگه داشت: فهرستی از سه‌تایی‌های (سطر، ستون، مقدار) که سطر به سطر مرتب‌اند.

ادامه‌ی توضیح ↓
ورودی:
A 6×6خروجی PDF

ماتریس ۶×۶ با ۸ جمله‌ی ناصفر؛ ترانهاده با دو گذر روی جمله‌ها ساخته می‌شود.

  1. def fast_transpose(A):
  2. rows, cols = len(A), len(A[0])
  3. # The sparse form: one (row, column, value) triple per non-zero, row by row.
  4. terms = [(i, j, A[i][j]) for i in range(rows) for j in range(cols) if A[i][j] != 0]
  5. # 1. How many terms each column has, and where its block starts in the result.
  6. row_terms = [0] * cols
  7. for _, j, _ in terms:
  8. row_terms[j] = row_terms[j] + 1
  9. start = [0] * cols
  10. for j in range(1, cols):
  11. start[j] = start[j - 1] + row_terms[j - 1]
  12. # 2. Drop each term straight into its place, swapping row and column.
  13. b = [None] * len(terms)
  14. for i, j, v in terms:
  15. b[start[j]] = (j, i, v)
  16. start[j] = start[j] + 1
  17. return b

ناوردا: start[j] همیشه اولین جای خالی بلوک ستون j در b است؛ چون سه‌تایی‌ها سطر به سطر می‌آیند، هر بلوک مرتب پر می‌شود.

شروع اجرا

row_terms—
start—

terms

جدول هنوز خالی است.

b

جدول هنوز خالی است.

متغیرهای محلی

نارنجی = در همین گام عوض شد

A list

[15, 0, 0, 22, 0, -15][0, 11, 3, 0, 0, 0][0, 0, 0, -6, 0, 0][0, 0, 0, 0, 0, 0][91, 0, 0, 0, 0, 0][0, 0, 28, 0, 0, 0]

Call stack

  1. fast_transpose()خط 1
گام ۱ از ۶۰
خط سیاه = place · خط نارنجی = گام کلیدیtriples: 0/1 · count: 0/8 · start_of: 0/5 · place: 0/8
    توضیح

    ایده

    ماتریسی که بیشتر خانه‌هایش صفر است (خلوت) را بهتر است فقط با جمله‌های ناصفرش نگه داشت: فهرستی از سه‌تایی‌های (سطر، ستون، مقدار) که سطر به سطر مرتب‌اند.

    ترانهاده‌ی سریع

    ترانهاده یعنی هر (i, j, v) بشود (j, i, v)؛ ولی نتیجه هم باید سطر به سطر (یعنی بر اساس j) مرتب باشد. به‌جای مرتب کردن:

    1. بشمار هر ستون j چند جمله دارد.
    2. با جمع پیشوندی، start[j] را حساب کن: بلوک ستون j در نتیجه از کجا شروع می‌شود.
    3. هر سه‌تایی را مستقیم در start[j] بگذار و start[j] را یکی جلو ببر.

    هزینه

    O(ستون‌ها + جمله‌ها)، در برابر O(ستون‌ها × جمله‌ها) در روش ساده‌ای که برای هر ستون کل فهرست را می‌گردد. (همان ایده‌ی مرتب‌سازی شمارشی.)

    در trace به چه چیزی نگاه کنی

    • جدول terms سه‌تایی‌های ورودی و b ترانهاده است که خانه به خانه پر می‌شود.