《传智播客-数据结构》01 数据结构基本概念 2018/10/14

1.数据结构概念

1.1 数据结构的起源

数据结构主要用于研究非数值计算程序问题中的操作对象以及它们之间的关系,不是研究复杂的算法

1.2基本概念

数据--程序的操作对象,用于描述客观事物(int  a ,int b)

数据的特点: 1、可输入到计算机内  2、可被计算机程序处理

数据是一个抽象的概念,将其分类后,得到程序设计语言中的类型。如,int float  char等等

数据元素:组成数据的基本单位

数据项:一个数据元素由若干数据组成

数据对象:性质相同的元素的集合

//来自结构体课堂代码
//声明一个结构体类型
struct _MyTeacher	//一种数据类型
{
	char	name[32];
	char	tile[32];
	int 	age;
	char 	addr[128];
};

int main()
{
	struct _MyTeacher	t1;		//数据元素
	struct _MyTeacher 	tArray[30];		//数据对象
	memset(&t1,0,sizeof(t1));			
	
	strcpy(t1.name,"name");		//数据项
	strcpy(t1.addr,"addr");		//数据项
	strcpy(t1.title,"addr");	//数据项
	t1.age = 1;
}

数据结构指数据对象中数据元素之间的关系  

1.3数据的逻辑结构

依据数据元素之间的关系,分为四种基本数据结构

1、集合--数据元素之间除“同属一个集合外”,无其他关系

2、线性结构--一个对一个,如,线性表,栈,队列

3、树形结构--一个对多个,如树

4、图形结构--多个对多个,如图

1.4数据的物理结构

即存储结构,是数据的物理结构在计算机存储器内的表示(映像).依赖于计算机

主要分为:顺序、链式、索引、散列

顺序存储--借助元素在存储器中的相对位置来表示,

链式存储--借助指示元素存储地址的指针来表示数据

 

算法设计-------逻辑结构

算法实现--------物理结构

1.5数据的运算

插入、删除、修改、查找、排序

2 算法

2.1基本概念

对特定问题求解步骤的描述

在计算机中国表现为指令的有限序列

算法是独立存在的一种解决问题的方法和思想

2.2算法和数据结构的区别

数据结构知识静态的描述了数据元素之间的关系

高效的程序需要在数据结构的基础上设计和选择算法

---程序= 数据结构+算法

2.3算法的特性:

输入:具有0个或者多个输入

输出:至少有一个或多个输出

有穷性:算法在有限的步骤之后会自动结束而不会无限循环

确定性:算法的每一步都有确定的含义,不会出现二义性。

可行性:算法的每一步都是可行的。

2.4算法效率的质量

1、事后统计法

比较不同算法对同一组输入数据的运行处理时间

事前分析估算

//算法最终编译成具体的计算机指令
//每一个指令,在具体的计算机上运行速度固定
//通过具体的n的步骤,就可以推导出算法的复杂度
long sum1(int n)
{
    long ret = 0;                         
    int* array = (int*)malloc(n * sizeof(int)); 
    int i = 0;  
    
    for(i=0; i<n; i++)   
    {
        array[i] = i + 1;
    }
    
    for(i=0; i<n; i++) 
    {
        ret += array[i];
    }
    
    free(array); 
    
    return ret; 
}

long sum2(int n)
{
    long ret = 0;
    int i = 0;
    
    for(i=1; i<=n; i++)
    {
        ret += i;
    }
    
    return ret;
}

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

int main()
{
    printf("%d\n", sum1(100));
    printf("%d\n", sum2(100));
    printf("%d\n", sum3(100));
    
    return 0;
}
int func(int a[], int len)
{
    int i = 0;
    int j = 0;
    int s = 0;
    
    for(i=0; i<len; i++) n
    {
        for(j=0; j<len; j++) n
        {
            s += i*j;  //n*n
        }
    }
    return s; 
}

说明:

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

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

2、大O表示法

算法效率严重依赖于操作(Operation)数量

在判断时首先关注操作数量的最高次项

操作数量的估算可以作为时间复杂度的估算

3、算法的空间复杂度

算法的空间复杂度通过计算算法的存储空间实现

S(n) = O(f(n))

其中,n为问题规模,f(n))为在问题规模为n时所占用存储空间的函数

大O表示法同样适用于算法的空间复杂度

当算法执行时所需要的空间是常数时,空间复杂度为O(1)

练习2:时间换空间 
/*
    问题: 
    在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。
    设计一个算法,找出出现次数最多的数字。
*/
方法1:
   排序,然后找出出现次数最多的数字

方法2:
void search(int a[], int len)
{
    int sp[1000] = {0};
    int i = 0;
    int max = 0;
    
    for(i=0; i<len; i++)
    {
        int index = a[i] - 1;
        
        sp[index]++;
    }
    
    for(i=0; i<1000; i++)
    {
        if( max < sp[i] )
        {
            max = sp[i];
        }
    }
    
    for(i=0; i<1000; i++)
    {
        if( max == sp[i] )
        {
            printf("%d\n", i+1);
        }
    }
}

int main()
{
    int array[] = {1, 1, 3, 4, 5, 6, 6, 6, 2, 3};
    
    search(array, sizeof(array)/sizeof(*array));
    
    return 0;
}

把每个数字出现的次数的中间结果,缓存下来;在缓存的结果中求最大值。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 是国内知名的IT培训机构,出品了一系列与编程相关的课程讲义。其中包括2018年的C语言基础、C语言提高、C++基础、Linux操作系统、C++提高以及数据结构等等。 C语言是一种被广泛应用的编程语言,是许多编程工作的基础。C语言基础课程通过系统性地介绍C语言的基本语法和程序设计思想,培养学员的编程能力和思维模式。C语言提高课程进一步深化了对C语言的理解,教授高级语法和更复杂的编程技巧,帮助学员提升编程水平。 C++是C语言的扩展,具有更强大的功能和更丰富的特性。C++基础课程向学员介绍了C++的基本语法和对象导向编程思想,培养学员进行面向对象的编程能力。C++提高课程进一步探讨了C++的高级特性和编程技巧,让学员可以在实际开发中灵活运用C++语言进行程序设计。 Linux是一种开源的操作系统,广泛应用于服务器和嵌入式设备等领域。Linux操作系统课程向学员介绍了Linux操作系统的基本结构和常用命令,培养学员熟练使用Linux系统进行开发和管理的能力。 数据结构是计算机科学与技术领域的重要基础课程,研究数据组织和算法的设计与分析。数据结构课程介绍了常用的数据结构,如线性表、树、图等,以及与之相关的算法和操作,培养学员解决实际问题的能力。 通过学习的这些课程讲义,学员可以系统地学习和掌握C语言、C++语言、Linux操作系统和数据结构等重要的编程知识和技能。这些讲义提供了详细的理论知识、示例代码和练习题,帮助学员深入理解和实践所学内容。同时,还通过丰富的教学资源和实践项目,帮助学员巩固所学知识并提升实际编程能力。 ### 回答2: 2018年C语言教程全套讲义,涵盖了C语言基础、C语言提高、Linux编程、C语言提高、数据结构等内容。这套讲义是为了帮助学习者全面掌握C语言编程及相关知识而编写的。 首先,C语言基础部分主要介绍了C语言的基本语法、数据类型、运算符、控制语句等基础知识。通过学习这部分内容,学习者能够了解C语言的基本特性,能够编写简单的C程序。 其次,C语言提高部分进一步深入讲解了C语言的高级特性,包括函数指针、结构体、文件操作、内存动态分配等内容。这些知识点的学习将使学习者能够编写更加复杂和高效的C程序。 Linux编程部分介绍了在Linux环境下进行C语言编程的相关知识。学习者将了解Linux的基本命令、文件系统、进程管理等内容,掌握在Linux系统上进行C语言程序开发的技巧。 C语言提高部分进一步拓展了C语言的应用领域,包括多线程编程、网络编程等内容。通过学习这部分内容,学习者将能够开发出更加复杂和高性能的C语言程序。 最后,数据结构部分介绍了常用的数据结构和算法,包括链表、栈、队列、树、图等内容。学习者将了解这些数据结构的原理及其在实际编程中的应用,能够选择和实现合适的数据结构来解决实际问题。 综上所述,2018年C语言教程全套讲义是一套非常全面而且实用的教材,对于想要学习和掌握C语言编程及相关知识的人来说是一本很好的学习材料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值