数据结构与算法_大彤小忆的博客-程序员宅基地

技术标签: 算法  数据结构  

1. 数据结构

  数据结构(Data Structure)是计算机存储、组织数据的方式,是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

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

  数据结构中的基本概念

  • 数据: 程序的操作对象,用于描述客观事物。数据是能输入计算机且能被计算机处理的各种符号的集合,是信息的载体,是对客观事物符号化的表示,能够被计算机识别、存储和加工。数据是一个抽象的概念,将其进行分类后得到程序设计语言中的类型,如int、float、char等等。
  • 数据元素: 组成数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。一个数据元素由若干个数据项组成。
  • 数据项: 构成数据元素的不可分割的最小单位。
  • 数据对象: 性质相同的数据元素的集合(比如:数组、链表),是数据的一个子集。

  数据元素不是孤立存在的,它们之间存在着某种关系,数据元素相互之间的关系称为结构(Structure)。数据结构是指互相之间存在一种或多种特定关系的数据元素的集合;或者说,数据结构是带结构的数据元素的集合。

  一个数据结构的例子如下所示。

//声明一个结构体类型
struct _MyTeacher  //一种数据类型
{
    
	char name[32];
	char title[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. 存储结构是逻辑关系的映像与元素本身的映像;
  2. 逻辑结构是数据结构的抽象,存储结构是数据结构的实现;
  3. 两者综合起来就建立了数据元素之间的结构关系。

  什么是数据结构?
  结构: 实体+关系
  数据结构: 按照逻辑关系组织起来的一批数据,按一定的存储方法把它存储在计算机中,在这些数据上定义了一个运算的集合。

2. 算法

  算法是对特定问题求解方法和步骤的一种描述,在计算机中表现为指令的有限序列,算法是独立存在的一种解决问题的方法和思想。

  算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法。对算法而言,语言并不重要,重要的是思想。

  算法的特性:

  • 输入: 算法具有0或多个输入;
  • 输出: 算法至少有1个或多个输出;
  • 有穷性: 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤都在有穷时间内完成。
  • 确定性: 算法中的每一步都有确定的含义,不会出现二义性,在任何条件下,只有唯一的一条执行路径,即相对于相同的输入只能得到相同的输出;
  • 可行性: 算法的每一步都是可行的,算法描述的操作可以通过已经实现的基本操作执行有限次来实现。

  算法设计的要求:正确性、可读性、健壮性、高效性。

  算法效率的分析:可以从时间效率和空间效率两方面进行分析。时间效率指的是算法所耗费的时间;空间效率指的是算法执行过程中所耗费的存储空间,但有时时间效率和空间效率是矛盾的。
  算法时间效率的度量: 算法时间效率可以依据该算法编制的程序在计算机上执行所消耗的时间来度量。有以下三种方法:
    1. 事后统计法:主要通过设计好的测试程序和数据,利用计算机的计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
     缺点: 1. 为了获得不同算法的运行时间必须编写相应程序;
         2. 运行时间严重依赖硬件以及运行时的环境因素;
         3. 算法的测试数据的选取相当困难。
     总结: 事后统计法虽然直观,但是实施困难且缺陷多。

    2. 事前分析估算:在计算机程序编写前,依据统计方法对算法所消耗资源进行估算。
     影响算法效率的主要因素: 1. 算法采用的效率和方法;
                  2. 问题的输入规模;
                  3. 编译器所产生的代码;
                  4. 计算机执行速度。

    3. 大O表示法:算法的时间复杂度通常用大O符号表述,定义为T[n] = O(f(n))。
     总结: 1. 只关注最高次项;
         2. 时间复杂度是指最坏时间复杂度;
         3. 只有常数项记作1。

  算法的空间复杂度并不是计算所有算法所占空间,而是使用辅助空间的大小。

3. 数据结构与算法的区别与联系

  数据结构与算法的区别与联系

  1. 数据结构只是静态的描述了元素之间的关系,高效的程序需要在数据结构的基础上设计和选择算法;
  2. 算法是为了解决实际问题而设计的;数据结构是算法需要处理的问题载体;
  3. 数据结构通过算法实现操作,算法根据数据结构设计程序;
  4. 程序=数据结构+算法,数据结构与算法相辅相成。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/HUAI_BI_TONG/article/details/116211663

智能推荐

苹果AR应用9月22日上新—— 炸僵尸、看星星、机械战 等等-程序员宅基地

我要和你去郊外的山上看星星……看完开……游戏炸僵尸再来一场机械战!——这就是今天苹果为你们安排的约会,你满意吗?我是Siri。

PHP版本的大智慧股票API接口demo-程序员宅基地

为什么80%的码农都做不了架构师?>>> ..._大智慧api

MAXHUB开启系统恢复_maxhub恢复出厂设置-程序员宅基地

MAXHUB系统恢复默认是关闭的.想要开启这个功能,按如下操作.开机前,请外接一个键盘.开机,并迅速按F2(反复按),将会出现BIOS设置界面。按键盘上“右箭头”键,将光标移动到“ADVANCED”,停住。按键盘上“下箭头”键,将光标移动到“Backup And OS Recovery”,停住。本行末尾显示Disabled,将其改为Enabled。此时屏幕右下将会出现2个新增操作说明。Alt+F3:Backup OSAlt+F4:Recovery OS此时就可以使用快_maxhub恢复出厂设置

PostgreSQL按照某一字段去重,并显示其他字段信息_postgresql中根据某一字段去重-程序员宅基地

以前遇到去重的地方更多的是MySQL去重后统计,比如select count(distinct 字段) from 表,后来临时遇到用Postgresql查询全部信息,但要对某个字段去重,查资料发现select * from table group by 要去重的字段,在MySQL上可以用,就搬到Postgresql试一下发现不行不能用;mysql去重查询语法:select count(dist..._postgresql中根据某一字段去重

folly 之 fbstring-程序员宅基地

follyfolly 是 facebook 开源的一个 c++ 基础库, 主打性能, 对 boost 或是 stl 的补充。folly 是基于 c++11 的, 大量采用现代 c++ 的特性, 是学习现代 c++ 编程的一份很好的素材。fbstringfbstring 是 std::string 的一个替代品, 它们的接口是完全兼容的。而且提供了接..._c++ fbstring

随便推点

fan4801开关电源原理图_开关电源工作原理分析及图解-程序员宅基地

开关电源就是用通过电路控制开关管进行高速的导通与截止。将直流电转化为高频率的交流电提供给变压器进行变压,从而产生所需要的一组或多组电压!转为高频交流电的原因是高频交流在变压器变压电路中的效率要比50HZ高很多.所以开关变压器可以做的很小,而且工作时不是很热!!成本很低.如果不将50HZ变为高频那开关电源就没有意义。开关电源的工作流程是:电源→输入滤波器→全桥整流→直流滤波→开关管(振荡逆变)→开关..._fan4801引脚功能

sigmoid代码实现-程序员宅基地

Sigmoid函数由下列公式定义: 其对x的导数可以用自身表示: import numpy as npimport matplotlib.pyplot as pltdef sigmoid(x): return 1.0 / (1 + np.exp(-x))sigmoid_inputs = np.arange(-..._sigmoid代码

unity 物体颜色从一端逐渐变到另一端_unity 颜色扩散-程序员宅基地

这个功能主要来自项目中模拟建筑工人每天施工进度情况,一个大构件工人不可能一天完成,这个构件工人完成多少要求该构件变色百分比就为多少直接看效果:变色的走向我们可以通过程序控制就是和shader简单交互就行,我这里是个简单的demo 大体思路没毛病 还是简单粗暴看代码吧unity的shader(封装的都不知道啥玩意)真的石乐志,一点不奔放,由于版本这块 查api差点放弃,有点op_unity 颜色扩散

关于Arcgis Desktop_arcgis desktop和 arcgis一样吗-程序员宅基地

我先说我的结论, 我认为ArcGisDesktop 10.2就是我们正常说的ArcGis10.2 在我初步接触webgis时,首先得把我所有的需要的软件配置好。根据我查的资料,我去需要先安装ArcGis Desktop,然后再进行Arcgis Sever的安装、可是当时我就懵了,我在学gis是安装过一个ArcGis10.2,我也没听过这个 ArcAis Desktop。那我安装了的是什么,需不需要安装一个ArcGis Desktop呢,我就去搜索 ArcGis Desktop是什么,结果只找到一..._arcgis desktop和 arcgis一样吗

arcengine栅格数据使用总结-程序员宅基地

arcengine栅格数据使用总结 两个星期以来一直与栅格数据打交道,对AO的栅格部分应该有了一定的理解,下面是自己的一点体会,希望高手指教:-) 1、栅格数据的存储类型 栅格数据一般可以存储为ESRI GRID(由一系列文件组成),TIFF格式(包括一个TIF文件和一个AUX文件),IMAGINE Image格式 在AE中一般调用ISaveAs接口来保存栅格数据 2、栅格...

小程序之唤起电话_小程序 唤起电话 开发社区-程序员宅基地

二、小程序唤起通讯录️1.官网链接????https://developers.weixin.qq.com/miniprogram/dev/api/device/phone/wx.makePhoneCall.html代码如下(示例):参数phoneNumber 是 需要拨打的电话号码success 否 接口调用成功的回调函数fail 否 接口调用失败的回调函数2.官网示例代码如下(示例):wx.makePhoneCall({ phoneNumber: '1340000' _小程序 唤起电话 开发社区