马上要到校招了,复习下相关的基础知识。

时间复杂度是什么?

官方解释:

算法的执行时间需要依据算法所编制的程序在计算机上于运行时所消耗的时间来度量。在算法中可以使用基本的语句的执行次数作为算法的时间复杂单位,可以认为一个特定算法时间性能只依赖于问题的规模(n),或者说它是一个特定算法时间性能只依赖于问题n的一个函数f(n),当问题规模n趋近于无穷大时的时间量级就称为算法的渐近时间复杂性,简称时间复杂度。

其实说白了就是看这个程序可以执行多少步,看它是否有循环,最后在把值估计计算下就是时间复杂度了,

先看一个简单的类子;

#include "stdio.h"
int main(){ int i,s=0;
for(i=0;i<=n;i++){
s=s+i;
}
printf("%d\n",s);
return 0;
}

这只是一个for循环而已,那么它的时间复杂度是多少呢;可以将每一步的执行步骤写出来,都加起来,计算出其总的时间复杂度。这个时间复杂度是O(n);也就是线性表示。

看下面的这个表。

名称 时间复杂度T(n) 说明
常量阶 O(1) 于问题规模无关的算法
线性阶 O(n) 相关的单循环
平方阶 O(n*n) 二重循环
对数阶 O(log2^n) 折半查找算法
复合阶 O(nlog2^n) 堆排序算法

一些常见的算法

  • 起泡排序算法(冒泡法)

思路:就是一列数据,拿着第一个数据开始往后面比较,若大于则交换,否则不交换,这样就把其值按照从小到大或者从大到小的顺序来排序。这里需要一个临时变量保存值。

#include "stdio.h"
int main(){
int a[8]={1,3,1,2,34,4,5,6};
int i,j,temp=1; //temp作为临时变量
for(i=1;i<8;i++)
for(j=1;j<=8-i;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
for(i=1;i<8;i++){
printf("%d,",a[i]);
}
printf("你好世界\n");

重点是内层循环的比较,也就是那里面的每一次交换值。时间复杂度为T(n)=O(n^2);

名词解释

数据元素是描述数据的基本单位;数据项是描述数据的最小单元;数据对象是数据的一个子集,数据结构是由数据和结构组成,也就是数据元素及数据元素之间关系的集合。相互之间有一种或多种特定关系的数据元素的集合。

逻辑结构:是以抽象的数学模型来描述数据结构中数据元素之间的逻辑关系,使用二元组来表示;

物理结构:叫做存储结构,是数据结构在计算机内的存储表示,也是内存映像;

在PC内部主要以顺序存储和链式存储来表示数据元素在逻辑上的相邻关系。链式存储结构的特点是逻辑上相邻接的数据元素在存储地址上不一定相邻接,数据元素逻辑上的相邻关系是通过指针来描述的,常用它来描述树状结构和图状结构在计算机内部的存储。

数据类型就是一个值的集合和定义在这个值集上的一组操作的总称。

思维导图:第一次使用感觉还不错。就感觉流程图一样但是给人感觉不一样,很直观,没有什么冗余在里面。

了解线性表

线性表是n个数据元素a1,a2,…an组成的有限序列,记为L=(a1,a2…an);若n=0,则表示空表;同一个数据线性表中的数据元素必须具有相同的属性,即属于同一数据对象。

顺序表就是把线性表中的数据元素按其逻辑顺序依次存储在物理地址上也相邻的存储单元中,这种存储结构称为顺序结构存储,用顺序存储结构表示顺序表;顺序表的存储结构是一种随机存取的存储结构。

/*
01---顺序表的存储
*/ //表的定义
typedef int ElemType;
#define INITSIZE 100; //初始分配量
//定义了结构体
typedef struct{
ElemType *data; //数据域
int length; //长度
int listsize; //当前的存储容量
} sqlist; //为顺序表的类型名 //初始化操作
void initlist(sqlist *L){
L->data=(ElemType *)malloc(sizeof(ElemType)*INITSIZE); //动态申请存储空间
L->length=0;
L->listsize=INITSIZE;
}
//求表长操作
int getlen(sqlist *L){
return(L->length);
}
//取出数据元素
int getelem(sqlist *L,int i,ElemType *e){
if(i<1||i>L->length)return 0;
*e=L->data[i-1]; //相当与数组一样,下标差一位。
return 1;
}
//元素定位操作
int locate(sqlist *L,ElemType x){
int i=0;
while(i<L->length){
if(L->data[i]==x)
return i+1;
else
i++;
}
return 0;
}
//插入操作
int insert(sqlist *L,int i,ElemType x){
int j;
if(i<1||i>L->length+1)return 0;
if(L->length==L->listsize){
L->data=(ElemType *)realloc(L->data,(L->listsize+1)*sizeof(ElemType));
L->listsize++;
}
for(j=L->length-1;j>=i-1;j--){
L->data[j+1]=L->data[j]; //将所有的元素后移一位。
L->data[i-1]=x; //将元素插入i位置处。
L->length++; //长度加1;
return 1;
}
}
//删除元素
int delete(sqlist *L,int i,ElemType *e){
int j;
if(i<1||i>L->length)return 0;
*e=L->data[i-1];
for(j=i;j<L->length;j++){
L->data[j-1]=L->data[j];
L->length--;
}
}
//输出操作
void list(sqlist *L){
int i;
for(i=0;i<L->length;i++)
printf("%5d",L->data[i]);
printf("\n");
}

了解链表

顺序表在插入删除时需要移动大量的数据,这样导致内存消耗大,时间长,至此发明了链表来处理这种情况,使用链表可以指定在那里插入数据,不会移动所有的元素.只是指针的变化.当然这里也有缺点,只能进行顺序的存取,不行随机存取.

对于链表我们在内存中可以不按照顺序存储,只需要就将其指针对应起来,通过指针就可以找到所有的存储地点 。

  • 单链表:只有两个区域,数据区和指针区,且有一个 头指针,最后一个数据与为NULL,所有的结点通过指针连接起来而组成链表。由于每个结点只包含一个指针域,所以称为单链表;
/*
单链表:
*/
typedef int ElemType;
typedef struct node{
ElemType data; //数据域
struct node * Next; //指针域
}slink; //结构体名 //建立单链表
slink *creslink(int n){
slink *head,*p,*s;
int i;
p=head=(slink *)malloc(sizeof(slink)); //创建头节点
for(i=1;i<=n;i++){
s=(slink *)malloc(sizeof(slink));
scanf("%d",&s->data);
p->Next=s;
p=s;
}
p->Next=NULL; //尾结点置空;
return head;
}
//求链表长度 ----使用n做累加值,求其链表的长度;
int getlen(slink * head){
slink *p;
int n;
p=head->Next;n=0;
while(p!=NULL){
n++;
p=p->Next;
}
return n;
}
//取元素操作
int getelem(slink *head,int i,ElemType *e){
slink *p;
int j;
if(i<1)return 0;
p=head->Next;j=1;
while(p!=NULL&&j<i){ //计算取出那个位置的值,也就是将P指定到位置。
p=p->Next;j++;
}
if(p==NULL)
return 0;
*e=p->data;
return 1;
}
//定位操作
slink * locate(slink *head,ElemType x){
int i;
slink *p;
p=head->Next;i=1;
while(p!=NULL&&p->data!=x){ //确定x的位置,将指针P抛出;
p=p->Next;i++;
}
return p;
}
//删除操作
int delete(slink * head,int i,ElemType *e){
slink * p,* q;
int j;
if(i<1) return 0;
p=head;j=0;
while(p->Next!=NULL&&j<i-1){ //确定出i的位置,
p=p->Next;j++;
}
if(p->Next==NULL)return 0;
q=p->Next; //删除元素,这里的最重要;
p->next=q->next;
*e=q->data;
free(q); //释放删除的元素空间
return 1;
} //插入元素
int insert(slink *head,int i,ElemType x){
slink *p,*q;
int j;
if(i<1)return 0;
p=head;j=0;
while(p!=NULL&&j<i+1){
p=p->Next;j++;
}
if(p==NULL)return 0;
q=(slink *)malloc(sizeof(slink)); //申请空间
q->data=x;
q->Next=p->Next; //相当于头插法;
p->Next=q;
return 1;
}
//输出操作
void list(slink *head){
slink *p;
p=head->Next;
while(p!=NULL){
printf("%4d",p->data);
p=p->Next;
}
printf("\n");
}

数据结构(C语言第2版)----时间复杂度和单链表的更多相关文章

  1. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  2. 数据结构(c语言第2版)-----了解链表,栈,队列,串

    关于链表我觉得这都是最基本的东西,但是不常见,在实际的应用中很少的使用,了解它会用就OK,不需要研究的那么深,除非做那种内存压缩,存储方面工作. C语言中动态申请空间 malloc() q=(dlin ...

  3. 用O(1)的时间复杂度删除单链表中的某个节点

    给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数的声明如下: ...

  4. 数据结构(C语言第2版)-----数组,广义表,树,图

    任何一个算法的设计取决于选定的数据结构,而算法的实现依赖于采用的存储结构. 之前线性表的数据元素都是非结构的原子类型,元素的值是不可再分的.下面学习的这两个线性表是很特殊的,其中数据元素本身也可能是一 ...

  5. 数据结构C语言实现系列——线性表(单向链表)

    #include <stdio.h> #include <stdlib.h> #define NN 12 #define MM 20 typedef int elemType ...

  6. 《Java数据结构与算法》笔记-CH5-链表-2单链表,增加根据关键字查找和删除

    /** * Link节点 有数据项和next指向下一个Link引用 */ class Link { private int iData;// 数据 private double dData;// 数据 ...

  7. 《Java数据结构与算法》笔记-CH5-链表-1单链表

    /** * Link节点 * 有数据项和next指向下一个Link引用 */ class Link { private int iData;//数据 private double dData;//数据 ...

  8. c语言实现--不带头结点的单链表操作

    1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链 ...

  9. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

随机推荐

  1. centos 6.5 X64 安装 mongodb 2.6.1 (笔记 实测)

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Centos-6.5-x86_64 *** Centos编译安装mongodb 2.6 系统最好是64位的,才 ...

  2. 人人都是 DBA(XV)锁信息收集脚本汇编

    什么?有个 SQL 执行了 8 秒! 哪里出了问题?臣妾不知道啊,得找 DBA 啊. DBA 人呢?离职了!!擦!!! 程序员在无处寻求帮助时,就得想办法自救,努力让自己变成 "伪 DBA& ...

  3. Aoite 系列 目录

    介绍 本项目从2009年孵化(V->Sofire->Aoite),至今已度过5个年头.一直在优化,一直在重构,一直在商用.有十分完整的单元测试用例.可以放心使用. Aoite on 博客园 ...

  4. [.net 面向对象编程基础] (3) 基础中的基础——数据类型

    [.net 面向对象编程基础] (3) 基础中的基础——数据类型 关于数据类型,这是基础中的基础. 基础..基础..基础.基本功必须要扎实. 首先,从使用电脑开始,再到编程,电脑要存储数据,就要按类型 ...

  5. [专业名词·硬件] 1、等效串联电阻ESR概述及稳压电路中带有一定量ESR电容的好处

        一.等效串联电阻ESR概述 ESR是Equivalent Series Resistance的缩写,即“等效串联电阻”.理想的电容自身不会有任何能量损失,但实际上,因为制造电容的材料有电阻,电 ...

  6. [nRF51822] 5、 霸屏了——详解nRF51 SDK中的GPIOTE(从GPIO电平变化到产生中断事件的流程详解)

    :由于在大多数情况下GPIO的状态变化都会触发应用程序执行一些动作.为了方便nRF51官方把该流程封装成了GPIOTE,全称:The GPIO Tasks and Events (GPIOTE) . ...

  7. Stealth视频教程学习笔记(第二章)

    Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

  8. 阿里云主机(aliyun-Linux) x64安装Redis详解

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/97.html?1455870336 如何在Linux​上安装Redis呢, ...

  9. redis数据结构整理(一)

    摘要: 0.redis安装 1.redis的常用数据结构类型 1.1  String 1.2  List 1.3  Set 1.4  Sorted Set 1.5  Hash 2.redis是单进程单 ...

  10. js笔记——js异常处理

    异常捕获 try...catch结构: try { //需要捕获的代码块 } catch (e) { console.log(e.name + ": " + e.message); ...