用C语言举例讲解数据结构中的算法复杂度结与顺序表

数据结构算法复杂度
1、影响算法效率的主要因素
(1)算法采用的策略和方法;

(2)问题的输入规模;

(3)编译器所产生的代码;

(4)计算机执行速度。

2、时间复杂度

// 时间复杂度:2n + 5
long sum1(int n)
{
  long ret = 0; \\1
  int* array = (int*)malloc(n * sizeof(int)); \\1
  int i = 0; \\1 

  for(i=0; i<n; i++) \\n
  {
    array[i] = i + 1;
  } 

  for(i=0; i<n; i++) \\n
  {
    ret += array[i];
  } 

  free(array); \\1 

  return ret; \\1
} 

\\时间复杂度: n + 3
long sum2(int n)
{
  long ret = 0; \\1
  int i = 0; \\1 

  for(i=1; i<=n; i++) \\n
  {
    ret += i;
  } 

  return ret; \\1
} 

\\时间复杂度: 3
long sum3(int n)
{
  long ret = 0; \\1 

  if( n > 0 )
  {
    ret = (1 + n) * n / 2; \\1
  } 

  return ret; \\1
}

随着问题规模n的增大,它们操作数量的差异会越来越大,因此实际算法在时间效率上的差异也会变得非常明显!

判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略。

在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度。

 3、空间复杂度

//空间复杂度:12 + n
long sum1(int n)
{
  long ret = 0; \\4
  int* array = (int*)malloc(n * sizeof(int)); \\4 + 4 * n
  int i = 0; \\4 

  for(i=0; i<n; i++)
  {
    array[i] = i + 1;
  } 

  for(i=0; i<n; i++)
  {
    ret += array[i];
  } 

  free(array); 

  return ret;
} 

\\空间复杂度: 8
long sum2(int n)
{
  long ret = 0; \\4
  int i = 0; \\4 

  for(i=1; i<=n; i++)
  {
    ret += i;
  } 

  return ret;
} 

\\空间复杂度: 4
long sum3(int n)
{
  long ret = 0; \\4 

  if( n > 0 )
  {
    ret = (1 + n) * n / 2;
  } 

  return ret;
}

多数情况下,算法执行时所用的时间更令人关注,如果有必要,可以通过增加空间复杂度来降低时间复杂度,同理,也可以通过增加时间复杂度来降低空间复杂度,具体问题,具体分析。

数据结构顺序表
表是具有相同类型的n(n >= 0)个数据元素的有限序列,即:

  • 线性表(List)是零个或多个数据元素的集合
  • 线性表中的数据元素之间是有顺序的
  • 线性表中的数据元素个数是有限的
  • 线性表中的数据元素的类型必须相同
//seq_list.h
#ifndef _SEQ_LIST_H_
#define _SEQ_LIST_H_ 

struct seq_list
{
  int capacity;
  int length;
  unsigned int *node;
}; 

struct seq_list* seq_list_create(int capacity);
int seq_list_capacity(struct seq_list* list);
int seq_list_length(struct seq_list* list);
int seq_list_insert(struct seq_list* list, int position, void* data);
void* seq_list_get(struct seq_list* list, int position);
void* seq_list_remove(struct seq_list* list, int position);
void seq_list_clear();
void seq_list_destroy(struct seq_list* list); 

#endif 

//seq_list.c
#include "seq_list.h"
#include <stddef.h>
#include <malloc.h> 

struct seq_list* seq_list_create(int capacity)
{
  int i = 0;
  struct seq_list* ret = NULL;
  if (capacity >= 0)
  {
    ret = (struct seq_list*) malloc(sizeof(struct seq_list) + sizeof(unsigned int) * capacity);
    if (ret != NULL)
    {
      ret->capacity = capacity;
      ret->length = 0;
      ret->node = (unsigned int*) (ret + 1);
    }
  }
  return ret;
} 

int seq_list_insert(struct seq_list* list, int position, void* data)
{
  int i = 0;
  int ret;
  ret = (list != NULL);
  ret = ret && position >= 0 && position < list->capacity;
  ret = ret && list->length < list->capacity;
  if (ret)
  {
    for (i = list->length; i > position; i--)
    {
      list->node[i] = (list->node[i - 1]);
    }
    list->node[i] = (unsigned int)data;
    double *p = (double *)data;
    list->length++;
  }
  return ret;
} 

void* seq_list_get(struct seq_list* list, int position)
{
  void* ret = NULL; 

  if (list != NULL && position >= 0 && position < list->length)
  {
    ret = (void *)list->node[position];
  }
  return ret;
} 

void* seq_list_remove(struct seq_list* list, int position)
{
  void* ret = NULL;
  int i = 0; 

  if (list != NULL && position >= 0 && position < list->length)
  {
    int i = 0;
    ret = seq_list_get(list, position);
    for (i = position + 1; i < list->length; i++)
    {
      list->node[i - 1] = list->node[i];
    }
    list->length--;
  }
  return ret;
} 

int seq_list_capacity(struct seq_list* list)
{
  int ret = -1;
  if (list != NULL)
  {
    ret = list->capacity;
  }
  return ret;
} 

int seq_list_length(struct seq_list* list)
{
  int ret = -1;
  if (list != NULL)
  {
    ret = list->length;
  }
  return ret;
} 

void seq_list_clear(struct seq_list* list)
{
  if (list != NULL)
  {
    list->length = 0;
  }
} 

void seq_list_destroy(struct seq_list* list)
{
  free(list);
  list = NULL;
} 

//seq_list_main.c
#include <stdio.h>
#include "seq_list.h" 

int main(void)
{
  struct seq_list* list = seq_list_create(100); 

  double *p = NULL;
  int ret = 0; 

  double a = 1.1;
  double b = 2.2;
  double c = 3.3;
  double d = 4.4;
  double e = 5.5; 

  seq_list_insert(list, 0, &a);
  seq_list_insert(list, 1, &b);
  seq_list_insert(list, 2, &c);
  seq_list_insert(list, 3, &d);
  seq_list_insert(list, 4, &e); 

  printf("list capacity = %d, length = %d\n", seq_list_capacity(list), seq_list_length(list));
  p = (double *)seq_list_get(list, 0);
  if (p != NULL)
  {
    printf("%lf\n", *p);
  } 

  p = (double *)seq_list_get(list, 3);
  if (p != NULL)
  {
    printf("%lf\n", *p);
  } 

  p = (double *)seq_list_remove(list, 3);
  if (p != NULL)
  {
    printf("remove data %lf, index at 3 , after length: %d\n", *p, seq_list_length(list));
  } 

  p = (double *)seq_list_get(list, 3);
  if (p != NULL)
  {
    printf("after remove, index at 3: %lf\n", *p);
  } 

  seq_list_clear(list);
  printf("after clear, list length is %d\n", seq_list_length(list)); 

  seq_list_destroy(list); 

  return 0;
}
(0)

相关推荐

  • C语言顺序表的实现代码

    本文实例为大家分享了C语言实现顺序表的具体代码,供大家参考,具体内容如下 seqlist.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include<cstdio> #include<malloc.h> #include<assert.h> #define SEQLIST_INIT_SIZE 8 #define INC_SIZE 3 //空间增量的大小 typedef int ElemType; typedef stru

  • C语言实现静态顺序表的实例详解

    C语言实现静态顺序表的实例详解 线性表 定义一张顺序表也就是在内存中开辟一段连续的存储空间,并给它一个名字进行标识.只有定义了一个顺序表,才能利用该顺序表存放数据元素,也才能对该顺序表进行各种操作. 接下来看看静态的顺序表,直接上代码: SeqList.h #define _CRT_SECURE_NO_WARNINGS 1 #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include <stdio.h> #include <stdlib.h&g

  • C语言线性表的顺序表示与实现实例详解

    1.概述 通常来说顺序表是在计算机的内存中以数组的形式保存的线性表,是用一组地址连续的存储单元依次存储数据元素的线性数据结构.线性表采用顺序存储的方式存储就称之为顺序表.顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中. 将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构就是顺序结构. 采用顺序存储结构的线性表简称为" 顺序表".顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 1≤

  • c语言实现顺序表的基本操作

    数据结构顺序表操作 复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <malloc.h>#define LIST_INIT_SIZE 100#define LISINCREMENT 10#define ElemType int#define Status inttypedef struct Sq{ ElemType *elem; int length; int listsize;}SqList;Statu

  • C语言实现顺序表基本操作汇总

    本文汇总了C语言下实现及操作顺序表的方法,对于学习数据结构的朋友来说是一个不错的参考程序.完整代码如下: #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef int status ;

  • C语言顺序表实现代码排错

    今天本来想写段代码练练手,想法挺好结果,栽了个大跟头,在这个错误上徘徊了4个小时才解决,现在分享出来,给大家提个醒,先贴上代码: 复制代码 代码如下: /******************************************** * 文件名称:sqlist.h * 文件描述:线性表顺序存储演示 * 文件作者:by Wang.J,in 2013.11.16 * 文件版本:1.0 * 修改记录:*********************************************/

  • 利用C语言实现顺序表的实例操作

    本文实例讲述了C语言实现顺序表(线性表)的方法.分享给大家供大家参考,具体如下: 一:顺序表代码实现 #ifndef _SEQ_LIST_H #define _SEQ_LIST_H #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> #define ElemType float //以float类型测试算法通用性,而不是以惯用的int #define I

  • C语言实现动态顺序表的实现代码

    C语言实现动态顺序表的实现代码 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构.线性表采用顺序存储的方式存储就称之为顺序表.顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中. 静态实现:结构体内部只需两个成员,其中一个为固定大小(MAX)的数组,用来存放我们的数据.数组大小我们可以通过在头文件中改变MAX的值来改变. 动态实现:在内存中开辟一块空间,可以随我们数据数量的增多来扩容. 来看看动态的顺序表实现: 1.seqli

  • 用C语言举例讲解数据结构中的算法复杂度结与顺序表

    数据结构算法复杂度 1.影响算法效率的主要因素 (1)算法采用的策略和方法: (2)问题的输入规模: (3)编译器所产生的代码: (4)计算机执行速度. 2.时间复杂度 // 时间复杂度:2n + 5 long sum1(int n) { long ret = 0; \\1 int* array = (int*)malloc(n * sizeof(int)); \\1 int i = 0; \\1 for(i=0; i<n; i++) \\n { array[i] = i + 1; } for(

  • C语言超详细讲解数据结构中双向带头循环链表

    目录 一.概念 二.必备工作 2.1.创建双向链表结构 2.2.初始化链表 2.3.动态申请节点 2.4.打印链表 2.5.销毁链表 三.主要功能 3.1.在pos节点前插入数据 尾插 头插 3.2.删除pos处节点数据 尾删 头删 3.3.查找数据 四.总代码 List.h 文件 List.c 文件 Test.c 文件 五.拓展 一.概念 前文我们已经学习了单向链表,并通过oj题目深入了解了带头节点的链表以及带环链表,来画张图总体回顾下: 在我们学习的链表中,其实总共有8种,都是单双向和带不带

  • C语言实例真题讲解数据结构中单向环形链表

    目录 1.例题引入 2.何为带环链表 3.题解思路 4.拓展问题 目录 1.例题引入 链接直达: 环形链表 题目: 2.何为带环链表 正常的单链表每个节点顺次链接,最后一个节点指向NULL,如下: 而带环链表的最后一个节点不再指向NULL了,指向的是前面任意一个节点,以此形成带环链表,并一直循环下去.如下: 3.题解思路 我们可以将上述图画的抽象一点,在没有进入环之前我们用直线表示,进入环之后用圈来表示,以此示意循环.此题需要用到我们之前讲解的求中间节点和求倒数第k个节点的快慢指针的思想.定义两

  • C语言超详细讲解数据结构中的线性表

    目录 前言 一.分文件编写 1.分文件编写概念 2.代码展示 二.动态分布内存malloc 1.初识malloc 2.使用方法 三.创建链表并进行增删操作 1.初始化链表 2.在链表中增加数据 3.删除链表中指定位置数据 四.代码展示与运行效果 1.代码展示 2.运行效果 总结 前言 计算机专业都逃不了数据结构这门课,而这门课无疑比较难理解,所以结合我所学知识,我准备对顺序表做一个详细的解答,为了避免代码过长,采用分文件编写的形式,不仅可以让代码干净利落还能提高代码可读性,先解释部分代码的含义,

  • C语言举例讲解i++与++i之间的区别

    目录 1.++i和i++的区别 2.++i与i++哪个效率更高 3.总结 1.++i和i++的区别 众所周知的(也是学校教的),就是先自增再赋值还是先赋值再自增的区别. #include<iostream> using namespace std; int main() { int a = 0; int b = 0; int c = ++a; int d = b++; cout << "c = " << c << endl; cout &

  • Java 超详细讲解数据结构中的堆的应用

    目录 一.堆的创建 1.向下调整(以小堆为例) 2.创建堆 3.创建堆的时间复杂度 二.堆的插入和删除 1.堆的插入 2.堆的删除 三.堆的应用 1.堆排序 2.top-k问题 [求最小的K个数] 四.常用接口的介绍 1.PriorityQueue的特性 2.优先级队列的构造 一.堆的创建 1.向下调整(以小堆为例) 让parent标记需要调整的节点,child标记parent的左孩子(注意:parent如果有孩子一定先是有左孩子) 如果parent的左孩子存在,即:child < size,

  • Java 超详细讲解数据结构中的堆的应用

    目录 一.堆的创建 1.向下调整(以小堆为例) 2.创建堆 3.创建堆的时间复杂度 二.堆的插入和删除 1.堆的插入 2.堆的删除 三.堆的应用 1.堆排序 2.top-k问题(求最小的K个数) 四.常用接口的介绍 1.PriorityQueue的特性 2.优先级队列的构造 一.堆的创建 1.向下调整(以小堆为例) 让parent标记需要调整的节点,child标记parent的左孩子(注意:parent如果有孩子一定先是有左孩子) 如果parent的左孩子存在,即:child < size, 进

  • C语言编程简单却重要的数据结构顺序表全面讲解

    目录 前言 一.线性表定义 二.顺序表实现 1概念及结构 2静态顺序表 2.1实现顺序表接口,第一步要对顺序表进行初始化 2.2对顺序表的增删查改的接口函数(以尾插为例) 3动态顺序表 3.1动态顺序表初始化 3.2动态顺序表-尾插 3.3动态顺序表-头插 3.4动态顺序表-尾删 3.5动态顺序表-头删 3.6动态顺序表-任意位置插入数据 3.7动态顺序表-任意位置删除数据 结束 前言 本文主要介绍顺序表的定义和常见静态顺序表的用法. 一.线性表定义 线性表(line list)是n个具有相同特

  • C语言实现顺序表的基本操作指南(注释很详细)

    目录 创建一个结构体用于存放顺序表相关数据 初始化顺序表 插入元素 先检查容量是否够用 删除元素 元素修改 查找元素 排序元素 元素反转 源码 SeqList.c test.c SeqList.h 总结 创建一个结构体用于存放顺序表相关数据 #define SEQTYPE int typedef struct SeqList { SEQTYPE* data; int size; //有效数据个数 int capacity; //容量 }SeqList; 初始化顺序表 void SeqListIn

随机推荐