什麼是數據結構

1、數據結構與算法官方定義

  • 「數據結構是數據對象,以及存在於該對象的實例和組成實例的數據元素之間的各類聯繫。這些聯繫能夠經過定義相關的函數來給出。」——Sartaj Sahni,《數據結構、算法與應用》算法

  • 「數據結構是ADT(抽象數據類型 Abstract DataType)的物理實現。」—— Clifford A.Shaffer,《數據結構與算法分析》編程

  • 「數據結構(data structure)是計算機中存儲、組織數據的方式。一般狀況下,精心選擇的數據結構能夠帶來最優效率的算法。」
    ——中文維基百科數組

綜上:從上面的三種官方定義能夠看出,數據結構和算法一般是一塊兒出現的數據結構

2、例1:如何在書架上(存儲空間)擺放圖書(數據)

只有事先得知數據規模的問題,才能獲得處理數據的方法數據結構和算法

2.1 方法1:隨便放

哪裏有空放哪裏,查找圖書困難編程語言

2.2 方法2:按照書名的拼音字母順序排放

二分查找,經過書名的拼音字母不斷縮小查找圖書的範圍,新書來了插入會成爲一個問題函數

2.3 方法3:綜合方法1和2

把書架劃分紅幾塊區域,每塊具區指定擺放各類類別的書;每塊區域內,按照書名的拼音字母順序排放,斟酌類的分法測試

綜上:解決問題方法的效率,和數據的組織方式有關spa

3、例2:寫程序實現一個函數PrintN,使得傳入一個正整數爲N的參數後,能順序打印1到N的所有正整數

3.1 方法1:循環實現

/* c語言實現 */

void PrintN (int N)
{int i;
 for (i=1; i<=N; i++)(
   printf("%d\n", i);
   )
   return;
}
# python語言實現

def print_n(n: int):
  for i in range(n):
        print(n)

3.2 方法2:遞歸實現

N過大,代碼會直接罷工

/* c語言實現 */

void PrintN (int N)
{if (N){
  PrintN(N - 1);
  printf("%d\n", N);
}
 return;
}
# python語言實現

def print_n(n: int):
  if n:
    print_n(n - 1)
    print(n)

綜上:解決問題方法的效率,和空間的利用效率有關

4、例3:寫程序計算給定多項式在給定點x處的值

4.1 方法1

\[ f(x) = a_0+a_1x+\cdots+a_{n-1}x^{n-1}+a_nx^n \]

對於上述的多項式,咱們可使用如下代碼實現:

/* c語言實現 */

double f(int n, double a[], double x)
{int i;
 double p = a[0]
   for (i=1; i<=n; i++)
     p += (a[i] * pow(x, i));
 return p;
}
# python語言實現

def f(n: int, a_list: list, x: float):
  p = a_list[0]
  for i in range(1, n):
    p += (a_list[i] * pow(x, i))
  return p

4.2 方法2

可是上述的方法極其複雜,咱們能夠對多項式進行以下化簡:
\[ f(x) = a_0+x(a_1+(x(\cdots(a_{n-1}+x(a_n))\cdots)) \]

/* c語言實現 */

double f(int n, double a[], double x)
{int i;
 double p = a[n];
 for (i=n; i>0; i--)
   p = a[i-1] + x*p;
 return p
}
# python語言實現

def f(n: int, a_list: list, x: float):
  p = a_list[n]
  for i in range(0,n,-1):
    p = a_list[i-1] + x*p
  return p

5、程序運行時間捕捉方法-clock()

clock():捕捉從程序開始運行到clock()被調用時所耗費的時間。這個時間單位是clock tick,即「時鐘打點」。

常數CLK_TCK:機器時鐘每秒所走的時鐘打點數。

/* c語言實現 */

#include <stdio.h>
#include <time.h>

clock_t start, stop;
/* clock_t是clock()函數返回的變量類型 */
double duration;
/* 記錄被測函數運行時間,以秒爲單位 */
int main()
{/* 不在測試範圍內的準備工做寫在clock()調用以前*/
 start = clock();  /* 開始計時 */
 MyFunction();  /* 把被測函數加在這裏 */ 
 stop = clock();  /* 中止計時 */
 duration = ((double)(stop -start))/CLK_TCK;
 /* 計算運行時間 */
 /* 其餘不在測試範圍的處理寫在後面,例如輸出duration的值 */
 return 0;
}
# python語言實現

import time

def main():
  start = time.clock()  # start = time.process_time()
  my_function()
  stop = time.clock()  # stop = time.process_time()
  t = stop - start  # 以秒爲單位
  
  return t

對於一個九項式的測試程序,運行一次,效果微乎其微,所以可讓被測函數重複運行充分屢次,使得測出的總的時鐘打點
間隔充分長,最後計算被測函數平均每次運行的時間便可!

綜上:解決問題方法的效率,和算法的巧妙程度有關

6、說到底,什麼是數據結構?

  • 數據對象在計算機中的組織方式
    • 邏輯結構
    • 物理存儲結構
  • 數據對象一定與一系列加在其上的操做相關聯
  • 完成這些操做所用的方法就是算法

7、抽象數據類型(Abstract Data Type)

  • 數據類型
    • 數據對象集:數據自己
    • 數據集合相關聯的操做集:類(數據和方法的集合)
  • 抽象:描述數據類型的方法不依賴於具體實現
    • 與存放數據的機器無關
    • 與數據存儲的物理結構無關
    • 與實現操做的算法和編程語言均無關

只描述數據對象集和相關操做集「是什麼」,並不涉及「如何作到」的問題,便可以理解爲僞代碼

8、例4:「矩陣」的抽象數據類型定義

  • 類型名稱:矩陣(\(Matrix\)
  • 數據對象集:一個\(M×N\)的矩陣\(A_{M×N}=(a_{ij})\,(i=1,\dots,M;\,j=1,\dots,N)\) (不考慮矩陣\(A\)是二維數組、一維數組、十字鏈表)\(M×N\)個三元組\(<a,i,j>\)構成,其中\(a\)是矩陣元素的,\(i\)是元素所在的行號,\(j\)是元素所在的列號。
  • 操做集:對於任意矩陣\(A、B、C \in Matrix\),以及整數\(i、j、M、N\)
    • Matrix Create( int M, int N ):返回一個\(M×N\)的空矩陣;
    • int GetMaxRow( Matrix A ):返回矩陣\(A\)的總行數;
    • int GetMaxCol( Matrix A ):返回矩陣\(A\)的總列數;
    • ElementType GetEntry( Matrix A, int i, int j ):返回矩陣\(A\)的第\(i\)行、第\(j\)列的元素;
    • Matrix Add( Matrix A, Matrix B ):若是\(A\)\(B\)的行、列數一致,則返回矩陣\(C=A+B\) (不考慮先按行加、先按列加、什麼語言實現),不然返回錯誤標誌;
    • Matrix Multiply( Matrix A, Matrix B ):若是A的列數等於B的行數,則返回矩陣\(C=AB\),不然返回錯誤標誌;
    • ......

綜上:抽象不須要關心具體的細節

相關文章
相關標籤/搜索