考研相關文章參考資料為 wjungle 大神提供的筆記

Array 元素之位置

一維陣列

  • A:array[l...u]A: array[l...u] of items
    • 共有 ul+1u - l + 1
    • 起始位置: l0l_0
    • 元素大小: dd
    • A[i]A[i] 的位置: l0+(il)dl_0 + (i - l) * d

二維陣列

  • A:array[l1...u1,l2...u2]A: array[l_1...u_1, l_2...u_2] of items
    • u1l1+1u_1 - l_1 + 1 列,u2l2+1u_2 - l_2 + 1
  • Row-major
    • A[i,j]=l0+[(il1)(u2l2+1)+(jl2)]dA[i, j] = l_0 + [(i - l_1) * (u_2 - l_2 + 1) + (j - l_2)] * d
  • Column-major
    • A[i,j]=l0+[(jl2)(u1l1+1)+(il1)]dA[i, j] = l_0 + [(j - l_2) * (u_1 - l_1 + 1) + (i - l_1)] * d

N 維陣列

  • A:array[l1...u1,l2...u2,l3...u3,...,ln...un]A: array[l_1...u_1, l_2...u_2, l_3...u_3, ... , l_n...u_n] of items
  • km=umlm+1(m=1,2,...,n)k_m = u_m - l_m + 1 (m = 1,2,...,n)
  • Row-major (由左往右)
    • A[i1,i2,...,in]=l0+[(i1l1)k2k3...kn+(i2l2)k3...kn+...+(in1ln1)kn+(inln)]dA[i_1, i_2,...,i_n] = l_0 + [(i_1 - l_1) * k_2 * k_3 *...*k_n + (i_2 - l_2) * k_3 *...*k_n + ... + (i_{n-1} - l_{n-1}) * k_n + (i_n - l_n)] * d
    • =l0+{p=1n[(iplp)q=p+1nkq]}d=l_0 + \{\sum_{p=1}^n [(i_p - l_p)*\prod_{q=p+1}^n k_q]\} * d
      • q=n+1nkq=1\prod_{q=n+1}^n k_q=1
  • Column-major (由右往左)
    • A[i1,i2,...,in]=l0+[(inln)kn1kn2...k1+(in1ln1)kn2...k1+...+(i2l2)k1+(i1l1)]dA[i_1, i_2,...,i_n] = l_0 + [(i_n - l_n) * k_{n-1} * k_{n-2} *...*k_1 + (i_{n-1} - l_{n-1}) * k_{n-2} *...*k_1 + ... + (i_2 - l_2) * k_1 + (i_1 - l_1)] * d
    • =l0+{p=1n[(iplp)q=1p1kq]}d=l_0 + \{\sum_{p=1}^n [(i_p - l_p)*\prod_{q=1}^{p-1} k_q]\} * d
      • q=10kq=1\prod_{q=1}^0 k_q=1

特殊矩陣

下三角矩陣

Lower-Triangular Matrix

  • AAnnn*n 方陣,且對角線 (不含) 右上方均為 0 元素,其餘為元素
    • A[i,j]=0, if i<jA[i, j] = 0,~if~i < j
  • 元素個數: n(n+1)2\frac{n(n+1)}{2}
  • 為了節省空間,可用一個矩陣 B:array[1...n(n+1)2]B: array[1...\frac{n(n+1)}{2}] 存放 A[i,j]A[i, j] 的元素,其中 B[k]B[k] 對應 i,ji,j 的方式為:
    • Row-major
      • k=i(i1)2+jk = \frac{i(i-1)}{2} + j
    • Column-major
      • k=n(j1)j(j1)2+ik = n(j - 1) - \frac{j(j-1)}{2} + i

上三角矩陣

Upper-Triangular Matrix

  • AAnnn*n 方陣,且對角線 (不含) 左下方均為 0 元素,其餘為元素
    • A[i,j]=0, if i>jA[i, j] = 0,~if~i > j
  • 元素個數: n(n+1)2\frac{n(n+1)}{2}
  • 為了節省空間,可用一個矩陣 B:array[1...n(n+1)2]B: array[1...\frac{n(n+1)}{2}] 存放 A[i,j]A[i, j] 的元素,其中 B[k]B[k] 對應 i,ji,j 的方式為:
    • Row-major
      • k=n(i1)i(i1)2+jk = n(i - 1) - \frac{i(i-1)}{2} + j
      • 下三角之 Column-major 公式 i,ji,j 對調
    • Column-major
      • k=j(j1)2+ik = \frac{j(j-1)}{2} + i
      • 下三角之 Row-major 公式 i,ji,j 對調

對稱矩陣

Symmetrix Matrix

  • AAnnn*n 方陣,且 A[i,j]=A[j,i]A[i, j] = A[j, i]
  • 為了節省空間,可用一個矩陣 B:array[1...n(n+1)2]B: array[1...\frac{n(n+1)}{2}] 存放下/上三角部分元素即可,其中 B[k]B[k] 對應 i,ji,jSingle expression (單一公式) 為:
    • k=Max(i,j)(Max(i,j)1)2+Min(i,j)k = \frac{Max(i,j)(Max(i,j) - 1)}{2} + Min(i,j)

帶狀/寬帶矩陣

Band Matrix

  • An,a,bA_{n,a,b}nnn*n 方陣,且
    • 對角線左下方 aa 條斜線為元素
    • 對角線右上方 bb 條斜線為元素
    • 其餘為 0 元素
  • 元素個數: a(2na+1)2+b(2nb+1)2n\frac{a(2n-a+1)}{2} + \frac{b(2n-b+1)}{2} - n

Link list 種類

  • Single link list 的最後一個 Node 之 pointer 指回第一個 Node
  • 不論從何點開始皆可拜訪所有 Nodes
    • Single link list 必須從頭開始
  • 回收整條串列空間 (加入 AV-list): O(1)O(1)
  • Linking 方向有兩個之 link list
    • LLink: 指向前一個 Node
    • RLink: 指向後一個 Node
    • 通常會加入 Head node (串列首): 不存資料
  • 插入 Node: 需要改變 4 個 pointer
  • 刪除 Node: 需要改變 2 個 pointer

比較表

Single link list Double link list
單向,只能知道前 or 後一個 Node 雙向,同時知道前後一個 Node
從頭開始才能遍歷,可靠性差 可從隨意位置遍歷,可靠性佳
插入、刪除 Node 簡單 插入、刪除 Node 複雜
Linking 空間少 Linking 空間多
  • Length: 求串列長度
    • Single link list: O(n)O(n)
    • Circular link list: O(1)O(1)
  • Concatenate: 兩條 Circular link list 合併
    • O(1)O(1)
  • Invert: 反轉 Single link list
    • O(n)O(n)

Generalize list

  • A=(a1,a2,...,an)A = (a_1, a_2,..., a_n) 是一個 Generalize listAAnn 個元素 a1,a2,...,ana_1, a_2,..., a_n,而 aia_i 元素的型態有兩種:

    • Atomic data
    • Sublist (另一個 Generalize list)
  • 術語:

    • A|A|: 表 AA 之長度
    • Head of A: a1a_1
    • Tail of A: (a2,...,an)(a_2,..., a_n)
  • 資料結構:

    Tag 變動欄位 Link
    True Data (Atomic data)
    False dlink (Pointer to Sublist)

Generalize list 操作

  • Copy a list
  • Equal: 判斷相等
  • Depth
    • 定義為所有 Sublist 之 Depth 最大值 + 1 (Nil: 0)

多項式表示

Array

  1. 根據指數由高至低儲存其係數,假設最高項指數為 nn,則準備 A:array[1,2...,n+2]A: array[1,2...,n+2] of int
    • 第一位儲存 nn 的數值
    • 之後依序儲存各項係數
    • 缺點: 對於最高項指數很大,但零項次很多的多項式,會浪費空間
  2. 只儲存非零項次指數與係數,假設多項式有 kk 個非零項次,則準備 A:array[1,2...,2k+1]A: array[1,2...,2k+1] of int
    • 第一位儲存 kk 的數值
    • 之後依序儲存各項指數及係數
    • 缺點: 不適用於零項次很少的多項式 (需要空間約為 1. 的兩倍)
  1. 使用 Link list 儲存指數與係數

    • 資料結構: exp (指數) | coe (係數) | link
    • 擴展 (多變數): x-exp | y-exp | coe | link
    • 缺點: 可能導致各個 Node 資料結構不一致 (變數數量不同)
  2. 使用 Generalize list 儲存資料

    • 資料結構:
    Tripple 變動欄位 exp link
    Var Variable (存變數名稱)
    Ptr dlink (Pointer to Sublist)
    No. coe (係數值)
    • ex:

Sparse Matrix 表示

稀疏矩陣: 含有大量 0 元素的 mnm*n 矩陣

Array

  1. 直接用 mnm*n 矩陣存放
    • 浪費空間
  2. 只存非零元素之資訊,以 <Row, Col, Value> 的結構儲存資料
    • 假設一個 mnm*n Sparse Matrix 含有 kk 個非零元素,則以 A:array[0...k,1...3]A: array[0...k, 1...3] of int 表示
      • 第 0 列儲存 matrix 資訊: <m, n, k>
  • 使用 Double link list: 儲存 RowCol 方向,且 Node 分為兩類:
  • Head node: 串列首,不存資料
    • 資料結構: Head (True) | Down | Right | Next
      • Down: pointer 指向所在行的第一個元素
      • Right: pointer 指向所在列的第一個元素
      • Next: pointer 指向下一個 Head node
    • Head node 數量 = Max(列數,行數)Max(列數, 行數)
  • Element node
    • 資料結構: Head (False) | Down | Right | Row | Col | Value
      • Down: pointer 指向下一個行元素
      • Right: pointer 指向下一個列元素
      • Row, Col, Value: 非零元素之資料