データ構造のコア用語の説明
以下の名前の説明は、「アルゴリズムとデータ構造」のYanWeimin版から引用したものです。
データ
それは客観的なものの象徴的な表現です。コンピュータサイエンスでは、コンピュータに入力してコンピュータプログラムで処理できるすべての記号の総称を指します。
データ要素
データ要素はデータの基本単位であり、通常、プログラム全体で考慮および処理されます。データ要素は、複数のデータ項目(データ項目)で構成できます。
データ項目
データ項目は、分割できないデータの最小単位です。データ項目は、客観的なものの特定の側面のデータ記述です。
データオブジェクト
同じ性質のデータ要素のコレクションであり、データのサブセットです。
データ構造
相互に特定の関係(関係)を持つ(存在する)データ要素のコレクションを指します。要素間の相互接続(関係)は論理構造と呼ばれます。データ要素間の論理構造には、4つの基本的なタイプがあります。
論理構造と物理構造
論理構造
データ要素間の関係は、特定の意味を表す要素間の自然な関係でも、問題の処理の便宜のために人工的に定義された関係でもかまいません。この自然または人工的に定義された「関係」は、データ要素間の論理と呼ばれます。 、対応する構造はと呼ばれ逻辑结构
ます。論理構造には、次の4つの基本的なタイプがあります。
集合
、構造内のデータ要素には、「同じセットに属する」以外の関係はありません。线性结构
、構造内のデータ要素間には1対1の関係があります。树形结构
、構造内のデータ要素間には1対多の関係があります。图状结构或网状关系
、構造内のデータ要素間には多対多の関係があります。
物理的構造
物理结构
コンピュータ内のデータ論理構造の格納形式を指し、一般的に3種類あります。
- 線形テーブルなどの順次ストレージ構造。
- 木のような連鎖貯蔵構造。
- 複合ストレージ構造を図に示します。
アルゴリズム
算法
は、特定の問題を解決するための方法(ステップ)の説明であり、命令の有限シーケンスであり、各命令は1つ以上の操作を表します。
アルゴリズムの特徴
- 有限性:アルゴリズムは常に有限のステップを実行した後に終了する必要があり、各ステップは有限の時間で完了します。
- 決定論的:アルゴリズムのすべての命令は正確な意味を持っている必要があります。あいまいさはありません。また、アルゴリズムには1つの入口と出口しかありません。
- 可行性:一个算法是能行的。即算法描述的操作都可以通过已经实现的基本运算执行有限次来实现。
- 输入:一个算法有零个或者多个输入,这些输入取自于某个特定的对象集合。
- 输出:一个算法有一个或多个输出,这些输出是同输出有着某些特定关系的量。
算法设计要求
评价一个好的算法有以下几个标准:
正确性
:算法应该满足具体问题的需求。可读性
:算法应该容易供人阅读和交流。可读性好的算法有助于对算法的理解和修改。健壮性
:算法应该有容错处理。当输入非法或者错误数据时,算法能适当的做出反应或者处理,而不是产生莫名其妙的输出结果。通用性
:算法应具有一般性,即算法的处理结果对于一般的数据集合都成立。效率与存储量需求
:效率指的是算法执行的时间;存储量需求指算法执行过程中所需要的最大存储空间。一般与问题的规模有关。
算法效率衡量方法
算法执行时间虚通过依据该算法编制的程序在计算机上运行所消耗的时间来度量,也就是时间复杂度
。
时间复杂度
算法中基本操作重复执行的次数是问题规模n的某个函数,其时间度量记作T(n)=O(f(n)),称作算法的渐近时间复杂度,简称时间复杂度
。一般地,常用最深层循环内的语句中的原操作的执行频度(重复执行的次数)来表示。 常用的时间复杂度的大小关系为:
空间复杂度
空间复杂度
:是指算法编写成程序后,在计算机中运行时所需存储空间的大小的度量。记作:S(n)=O(f(n))。其中n为问题的规模。例如:
线性表
线性表(Linear List)
:是由n(n>=0)个元素(结点)a1,a2……an组成的有限序列。该序列中的所有结点具有相同的数据类型。其中数据元素的个数n称为线性表的长度。
- 当n=0时,称为空表。
- 当n>0时,将非空线性表记作:(a1,a2……an),a1称为线性表的第一个(首)结点,an称为线性表的最后一个(尾)结点。
顺序存储
把线性表的结点按逻辑顺序
依次存放在一组地址连续的存储单元里。用这种方法存储的线性表简称顺序表。
顺序存储的特点
- 线性表的逻辑顺序与物理顺序一致;
- 数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。
顺序表的基本操作
顺序存储结构中,很容易实现线性表的一些操作:初始化、赋值、查找、修改、插入、删除、求长度等。
- 顺序表的初始化
Status Init_SqList(SqList *L){
L->elem_array = (ElemType*)malloc(MAX_SIZE*sizeof(ElemType));
if(!L->elem_array){
return ERROR;
}else{
L->Length = 0;
return OK;
}
}
复制代码
直接进行malloc
关键字的内存空间开辟。
- 顺序表的插入
Status Insert_SqList(Sqlist *L, int i, ElemType e){
int j;
if(i<0||i>L->Length-1) return ERROR;
if(L->Length >= MAX_SIZE){
printf("线性表溢出!");
return ERROR;
}
for(j= L->Length;j>=i-1;j--){
L->Elem_array[j+1] = L->Elem_array[j];
}
L->Elem_array[i-1] = e;
L->Length++;
return OK;
}
复制代码
步骤实现拆分:
- 将线性表L中的第i个至第n个结点后移一个位置。
- 将结点e插入到结点a[i-1]之后。
- 线性表长度加1。
- 线性表的删除
ElemType Delete_SqList(Sqlist *L,int i){
int l;
ElemType x;
if(L->length == 0){
printf("线性表L为空");
return ERROR;
}else if(i<1||i>L->length){
printf("要删除的数据元素不存在");
return ERROR;
}else{
//要删除的结点的值 保存
x = L->Elem_array[i-1];
for(k = i; k<L->Lenght;k++){
L->Elem_array[k-1] = L->Elem_array[k];
L->length--;
return(x);
}
}
}
复制代码
步骤解析:
- 将线性表L中的第i+1个至第n个结点依次向前移动一个位置。
- 线性表长度减1。
链式存储
用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性表简称线性链表
。
链式存储的特点
存储链表中结点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是分布在内存中的任意位置上的。链表中的逻辑顺序和物理顺序不一定相同。
本篇主要介绍了一些基本概念,下一篇会对链表进行详细的介绍和一些基本的操作进行算法实现。