数据结构与算法的基本概念
时间复杂度
空间复杂度
clock tick
#include <stdio.h> #include <time.h> clock_t tart,stop; double duration; int main(){ start=clock(); MyFunction(); stop=clock(); duration = ((double)(stop-start))/CLK_TCK; return 0; }
增长速度:1 < log n < n < nlog n < n^2 < n^3 < 2^n < n!
复杂度分析 两端算法复杂度分别 T1(n)=O(f1(n))和T2(n)=O(f2(n)),
则:T1(n)+T2(n)=max(O(f1(n)),O(f2(n)))
T1(n)*T2(n)=O(f1(n)*f2(n))
for循环时间复杂度等于循环次数诚意循环体代码的复杂度
if-else结构复杂度取决于if的条件判断复杂度和两个分支部分复杂度,总体复杂度取三者中最大
线性结构
顺序表储存方法
List MakeEmpty()//初始化(建立空的顺序表) { List Ptrl; Ptrl = (List)malloc(sizeof(struct LNode)); Ptrl->Last=-1; return Ptrl; } int Find(ElementType x,List Ptrl)//查找 { int i=0; while(i<=Ptrl->Last && Ptrl->Data[i]!=x) i++; if(i>Ptrl->Last) return -1; else return i; } void Insert(ElementType x,int i,List Ptrl)//插入操作 { int j; if(Ptrl->Last == MAXSIZE-1){ printf("表满"); return; } if(i<1||i>PtrL->Last+2){ printf("位置不合法"); return; } for(j=Ptrl->Last;j>=i-1;j--) Ptrl_Data[j+1]=Ptrl->Data[j]; Ptrl->Date[i-1]=x; Ptrl->Last++; return; } void Delete(int i,List Ptrl)//删除操作 { int j; if(i<1||i>Ptrl->Last+1){ printf("不存在第%d个元素",i); return; } for(j=i;j<=Ptrl->last;j++) Ptrl->Data[j-1]=Ptrl->Date[j]; Ptrl->Last--; return; }
链式储存方法
Typedef Struct LNode*List;//初始化定义 struct LNode{ ElementType Data; List Next; }; struct Lnode L; List Ptrl; int Length(List Ptrl)//求表长(链表遍历) { List p=Ptrl; int j=0; while(p){ p=p->Next; j++; } return j; } List FindKth(int K,List Ptrl)//按序号查找 { List p=Ptrl; int i=1; while(p!=NULL && i<K) { p=p->Next; i++; } if(i==K) return p;//找到第K个,返回指针 else return NULL; } List Find(ElementType x,List Ptrl)//按值查找 { List p=Ptrl; while(p!=NULL && p->Data!=x) p=p->Next; return p; } List Insert(ElementType x,int i,List Ptrl)//插入操作 { List p,s; if(i==1){//如果新结点插在表头 s=(List)malloc(sizeof(struct LNode)); s->Data=x; s->Next=Ptrl; return s; } p=FindKth(i-1,Ptrl);//如果插入第i个位置,查找第i-1个结点 if(p==NULL){//不存在,不能插入 printf("参数i错误"); return NULL; }else { s=(List)malloc(sizeof(struct LNode)); s->Data=x; s->Next=p->Next; //新结点插入在第i-1个结点后面 p-Next=s; return Ptrl; } } List Delete(int i,List Ptrl)//删除操作 { List p,s; if(i==1){//如果删除头结点 s=Ptrl; if(Ptrl!=NULL) Ptrl=Ptrl->Next;//删掉 else return NULL; free(s);//释放被删结点空间 return Ptrl; } p=FindKth(i-1,Ptrl);//查找第i-1个结点 if(p==NULL){ printf("第%d个结点不存在",i-1); return NULL; } else uf(p->Next == NULL){ printf("第%d个结点不存在",i); return NULL; } else { s=p->Next; P->Next = s->Next; free(s); return Ptrl; } }
广义表是 线性表的推广
多重链表 链表中的节点可能同时隶属于多个链
堆栈和队列
堆栈基本操作
#define MaxSize <储存数据元素的最大个数> typedef struct SNode *Stack; struct SNode{ ElementType Data[MaxSize]; int Top; }; //入栈 void Push(Stack Ptrs,ElementType item) { if(Ptrs->Top == MaxSize-1){ printf("堆栈满"); return ; } else { Ptrs->Data[++(Ptrs->Top)]=item; return ; } } //出栈 ElementType(Stack Ptrs) { if(Ptrs->Top == -1){ printf("堆栈空"); return RTTOR; } else return(Ptrs->Data[(Ptrs->Top)--]); } 堆栈链式储存,即链栈,单链表 typedef struct SNode *Stack; struct SNode{ ElementType Data; struct SNode *Next; }; Stack CreateStack()//创建堆栈 { Stack s; s = (Stack)malloc(sizeof(struct SNode)); s->Next = NULL; return s; } int IsEmpty(Stack s)//判断堆栈是否为空?1:0 { return (s->Next == NULL); } void Push (ElementType item,Stack s)//将元素item压入堆栈s { struct SNode *TmpCell; TmpCell=(struct SNode *)malloc(sizeof(struct SNode)); TmpCell->Element = item; TmpCell->Next = s->Next; s->Next = TmpCell; } ElementType Pop(Stack s)//删除并返回堆栈s的栈顶元素 { struct SNode *FirstCell;//引用一个指针变量 ElementType TopElem; if(IsEmpty(s)){ pintf("堆栈空"); return NULL; } else { FirstCell=s->Next; s->Next=FirstCell->Next; TopElem=FirstCell->Element; free(FirstCell); return TopElem; } }
队列的顺序存储(数组)
#define MaxSize <储存数据元素的最大个数> struct QNode{ ElementType Data[MaxSize]; int rear; int front; }; typedef struct QNode *Queue; void AddQ(Queue Ptrq,ElementType item)//入队列 { if((Ptrq->rear+1)%MaxSize == Ptrq->front){ printf("队列满"); return ; } Ptrq->rear=(Ptrq->rear+1)%MaxSize; Ptrq->Data[Ptrq->rear]=item; } ElementType DeleteQ(Queue Ptrq)//出队列 { if(Ptrq->front == Ptrq->rear){ printf("队列空"); return ERROR; } else { Ptrq->front=(Ptrq->front+1)%MaxSize; return Ptrq->Data[Ptrq->front]; } }
队列的链式存储
struct Node{ ElementType Data; strct Node *Next; }; struct QNode{ struct Node *rear; struct Node *front; }; typedef struct QNode *Queue; Queue Ptrq; //出队操作 ElementType DeleteQ(Queue Ptrq) { struct Node *FrontCell;//要弄出队列的变量 ElementTye *fromtElem; if(Ptrq->front == NULL){ printf("队列空"); return ERROR; } FrontCell = Ptrq->front; if(Ptrq->front == Ptrq->rear)//若队列只有一个元素 Ptrq->front = Ptrq->rear= NULL;//删除后队列置为空 else Ptrq->front = Ptrq->front->Next; FrontElem = FrontCell->Data; free(FrontCell); return FrontElem; }
树与树的表达
二分查找算法
int BinarySearch(List Tbl,RlementType k) { int left,right,mid,NoFound=-1; left = 2; right=Tbl->Length; while(left <= right) { mid=(left+right)/2; if(k<Tbl->Element[mid]) right=mid-1; else if(k>Tbl->Element[mid]) left=mid+1; else return mid; } return NotFound; }
子树不相交,除根结点外,每个结点有且仅有一个父结点,一颗N个结点的树有N-1条边;
管理系统下课了,先到这里,略。2020-02-27 17:39:41
原文:https://www.cnblogs.com/Flyingeggs/p/12373295.html