什么是数据结构(代码片段)

NickChen121 NickChen121     2022-12-22     411

关键词:

数据结构与算法官方定义

  • “数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。这些联系可以通过定义相关的函数来给出。”——Sartaj Sahni,《数据结构、算法与应用》

  • “数据结构是ADT(抽象数据类型 Abstract DataType)的物理实现。”—— Clifford A.Shaffer,《数据结构与算法分析》

  • “数据结构(data structure)是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最优效率的算法。”
    ——中文维基百科

综上:从上面的三种官方定义可以看出,数据结构和算法通常是一起出现的

例1:如何在书架上(存储空间)摆放图书(数据)

只有事先得知数据规模的问题,才能得到处理数据的方法

方法1:随便放

哪里有空放哪里,查找图书困难

方法2:按照书名的拼音字母顺序排放

二分查找,通过书名的拼音字母不断缩小查找图书的范围,新书来了插入会成为一个问题

方法3:综合方法1和2

把书架划分成几块区域,每块具区指定摆放各种类别的书;每块区域内,按照书名的拼音字母顺序排放,斟酌类的分法

综上:解决问题方法的效率,和数据的组织方式有关

例2:写程序实现一个函数PrintN,使得传入一个正整数为N的参数后,能顺序打印1到N的全部正整数

方法1:循环实现

void PrintN (int N)
int i;
 for (i=1; i<=N; i++)(
   printf("%d\n", i);
   )
   return;
def print_n(n):
  for i in range(n):
        print(n)

方法2:递归实现

N过大,代码会直接罢工

void PrintN (int N)
if (N)
  PrintN(N - 1);
  printf("%d\n", N);

 return;
def print_n(n):
  if n:
    print_n(n - 1)
    print(n)

综上:解决问题方法的效率,和空间的利用效率有关

例3:写程序计算给定多项式在给定点x处的值

方法1

\[ f(x) = a_0+a_1x+\cdots+a_n-1x^n-1+a_nx^n \]

对于上述的多项式,我们可以使用以下代码实现:

double f(int n, double a[], double x)
int i;
 double p = a[0]
   for (i=1; i<=n; i++)
     p += (a[i] * pow(x, i));
 return p;
def f(n, a_list, x):
  p = a_list[0]
  for i in range(1, n):
    p += (a_list[i] * pow(x, i))
  return p

方法2

但是上述的方法极其复杂,我们可以对多项式进行如下化简:
\[ f(x) = a_0+x(a_1+(x(\cdots(a_n-1+x(a_n))\cdots)) \]

double f(int n, double a[], double x)
int i;
 double p = a[n];
 for (i=n; i>0; i--)
   p = a[i-1] + x*p;
 return p
def f(n, a_List, x):
  p = a[n]
  for i in range(0,n,-1):
    p = a[i-1] + x*p
  return p

程序运行时间捕捉方法-clock()

clock():捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”。

常数CLK_TCK:机器时钟每秒所走的时钟打点数。

#include <stdio.h>
#include <time.h>

clock_t start, stop;
/* clock_t是clock()函数返回的变量类型 */
double duration;
/* 记录被测函数运行时间,以秒为单位 */
int main()
/* 不在测试范围内的准备工作写在clock()调用之前*/
 start = clock();  /* 开始计时 */
 MyFunction();  /* 把被测函数加在这里 */ 
 stop = clock();  /* 停止计时 */
 duration = ((double)(stop -start))/CLK_TCK;
 /* 计算运行时间 */
 /* 其他不在测试范围的处理写在后面,例如输出duration的值 */
 return 0;
import time

def main():
  start = time.clock()  # start = time.process_time()
  my_function()
  stop = time.clock()  # stop = time.process_time()
  t = stop - start  # 以秒为单位
  
  return t

对于一个九项式的测试程序,运行一次,效果微乎其微,因此可以让被测函数重复运行充分多次,使得测出的总的时钟打点
间隔充分长,最后计算被测函数平均每次运行的时间即可!

综上:解决问题方法的效率,和算法的巧妙程度有关

说到底,什么是数据结构?

  • 数据对象在计算机中的组织方式
    • 逻辑结构
    • 物理存储结构
  • 数据对象必定与一系列加在其上的操作相关联
  • 完成这些操作所用的方法就是算法

抽象数据类型(Abstract Data Type)

  • 数据类型
    • 数据对象集:数据本身
    • 数据集合相关联的操作集:类(数据和方法的集合)
  • 抽象:描述数据类型的方法不依赖于具体实现
    • 与存放数据的机器无关
    • 与数据存储的物理结构无关
    • 与实现操作的算法和编程语言均无关

只描述数据对象集和相关操作集“是什么”,并不涉及“如何做到”的问题,即可以理解为伪代码

例4:“矩阵”的抽象数据类型定义

  • 类型名称:矩阵(Matrix)
  • 数据对象集:一个\(M×N\)的矩阵\(A_M×N=(a_ij)\,(i=1,\dots,M;\,j=1,\dots,N)\) (不考虑矩阵\(A\)是二维数组、一维数组、十字链表)\(M×N\)个三元组\(<a,i,j>\)构成,其中\(a\)是矩阵元素的,\(i\)是元素所在的行号,\(j\)是元素所在的列号。
  • 操作集:对于任意矩阵\(A、B、C \in Matrix\),以及整数\(i、j、M、N\)
    • Matrix Create( int M, int N ):返回一个\(M×N\)的空矩阵;
    • int GetMaxRow( Matrix A ):返回矩阵\(A\)的总行数;
    • int GetMaxCol( Matrix A ):返回矩阵\(A\)的总列数;
    • ElementType GetEntry( Matrix A, int i, int j ):返回矩阵\(A\)的第\(i\)行、第\(j\)列的元素;
    • Matrix Add( Matrix A, Matrix B ):如果\(A\)\(B\)的行、列数一致,则返回矩阵\(C=A+B\) (不考虑先按行加、先按列加、什么语言实现),否则返回错误标志;
    • Matrix Multiply( Matrix A, Matrix B ):如果A的列数等于B的行数,则返回矩阵\(C=AB\),否则返回错误标志;
    • ......

综上:抽象不需要关心具体的细节

数据集市是什么?(代码片段)

文章目录一、数据集市简介1.1、数据集市与数据仓库二、数据集市的类型2.1.依赖数据仓库2.2.独立数据集市2.3.混合数据集市三、数据集市的特点四、数据集市的优点五、实施数据集市的步骤关注我的公众号【宝哥大数据】,... 查看详情

什么是dockervolume?(代码片段)

...数据的安全性。这篇博客将通过简单的实践帮助大家理解什么是DockerVolume。本文所有命令都是在play-with-docker的在线Docker实例上执行, 查看详情

什么是表头结点,什么又是表结点(代码片段)

学数据结构的时候,链表中,每次问道这个问题,我都不是很清楚,现在终于是搞懂了,那么就在博客里面记录一下吧第一个是头结点第二个是表结点   查看详情

什么是immutable?为什么要使用它?(代码片段)

...le对象Immutable实现的原理是PersistentDataStructure(持久化数据结构)用一种数据结构来保存数据当数据被修改时,会返回一个 查看详情

什么是immutable?为什么要使用它?(代码片段)

...le对象Immutable实现的原理是PersistentDataStructure(持久化数据结构)用一种数据结构来保存数据当数据被修改时,会返回一个 查看详情

elasticsearch是什么?(代码片段)

...案1.4内存数据库解决方案二Elasticsearch介绍2.1Elasticsearch是什么2.2Lucene与Elasticsearch关系2.3Elasticsearchvssolr2.4Elasticsearch核心概念2.4.1Clus 查看详情

简述什么是视图(代码片段)

...单:使用视图的用户完全不需要关心视图中的数据是通过什么查询得到的。视图中的数据对用户来说已经是过滤好的符合 查看详情

什么是数据库视图(view),视图(view)优缺点是什么?(代码片段)

什么是数据库视图(view),视图(view)优缺点是什么?什么是数据库视图(view)?在SQL中,视图是基于SQL语句的结果集的可视化的表。视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的... 查看详情

数据结构前言(代码片段)

算法的复杂度前言什么是数据结构?什么是算法?一、算法效率二、时间复杂度三、空间复杂度四、常见复杂度对比前言什么是数据结构?  数据结构(DataStructure)是计算机存储、组织数据的方式,指相互之间存... 查看详情

什么是orm(代码片段)

一、ORM简介对象关系映射(ObjectRelationalMapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关... 查看详情

什么是数据库事务?(代码片段)

什么是事务?事务是由一个或多个sql语句组成的一个整体,如果所有语句执行成功那么修改将会全部生效,如果一条sql语句将销量+1,下一条再+1,倘若第二条失败,那么销量将撤销第一条sql语句的+1操作,只有在该事务中所有的... 查看详情

javascript对象的底层数据结构是什么(代码片段)

上一篇文章归纳了javascript的数据类型,归根到底数据类型就分为两类,一种是基础类型,一种是引用类型。如果还没有看的同学这里附上超链接《JavaScript规定了几种语言类型》基本类型内容:String、Number、Boolean... 查看详情

streamsets学习系列之streamsets是什么?(代码片段)

      不多说,直接上干货!     StreamSets是一个侧重数据集成、数据加工流程构建的平台,也是一个开源的产品。通过StreamSets,用户可以方便的接入不同的数据源,并且完成数据加工流程的构建。SteamSe... 查看详情

为什么vue组件数据必须是一个函数?(代码片段)

我正在阅读Vuecomponents,并找到他们解释为什么数据需要成为一个有点令人困惑的函数:根实例varvm=newVue(el:'#example',data:message:'heredataisaproperty')一个组件varvm=newVue(el:'#example',data:function()returncounter:0)Vue文档通过为每个组件分配一个 查看详情

数据库索引,到底是什么做的(代码片段)

问题1.数据库为什么要设计索引?图书馆存了1000W本图书,要从中找到《架构师之路》,一本本查,要查到什么时候去?于是,图书管理员设计了一套规则:一楼放历史类,二楼放文学类,三楼放IT类…IT类,又分软件类,硬件类... 查看详情

abi是什么?swiftabi稳定有什么好处?(代码片段)

...则是用户所运行的程序.一个ABI定义了机器代码如何访问数据结构与运算程序,此处所定义的界面相当地基并且相依于硬件.而类似概念的API则在源代码定义这些,较为高端,并不直接依赖于硬件,通常会是 查看详情

es查询数据的工作原理是什么?(代码片段)

...知识来源| http://8rr.co/GsAa面试题ES写入数据的工作原理是什么啊?ES查询数据的工作原理是什么啊?底层的Lucene介绍一下呗?倒排索引了解吗?面试官心理分析问这个,其实面试官就是要看看你了解不了解es的... 查看详情

stream(代码片段)

文章目录概述为什么要使用StreamAPI什么是StreamStream的操作三个步骤创建StreamStream的中间操作筛选与切片映射常用函数是接口排序Stream的终止操作匹配与查找归约收集概述为什么要使用StreamAPI关系型数据库&非关系型数据库一、... 查看详情