数据结构与算法--面试问答

问题与简答

数据结构与算法篇

1. 概述

解决问题的效率

解决问题方法的效率,跟数据的组织方式有关,跟空间的利用效率有关,也跟算法的巧妙程度有关

抽象数据类型

抽象数据类型(Abstract Data Type,ADT)是一种对"数据类型"的描述,这种描述是"抽象"的

数据类型描述内容:一是数据对象集,二是与数据集合相关联的操作集

算法定义

算法是一个有限指令集,它接受一些输入,产生输出,并在一定的有限步骤之后终止

算法复杂度
  • 空间复杂度 S(n):根据算法写成的程序在执行时占用存储单元的长度
  • 时间复杂度 T(n):根据算法写成的程序在执行时耗时时间的长度
分析算法效率
  • 最坏情况的复杂度 Tworst(n)
  • 平均复杂度 Tavg(n)

拓展阅读 《数据结构与算法概述》

2. 实现基础

数据结构的处理方法是从这些具体应用中抽象出共性的数据组织与操作方式,进而采用某种具体的程序设计语言实现相应的数据存储与操作

数据存储基础
  • 数组

数组是最基本的构造类型,它是一组相同类型数据的有序集合

  • 结构

结构类型是一种允许把一些数据分量聚合成一个整体的数据类型,它能够把有内在联系的不同类型的数据统一成一个整体,使它们相互关联

  • 链表

链表是一种常见而重要的基础数据结构,也是实现复杂数据结构的重要手段

流程控制基础

程序设计语言除了能够表达各种各样的数据外,还必须提供一种手段来表达数据处理的过程,即程序的控制过程

按照结构化程序设计的观点,任何程序都可以将程序模块通过三种基本的控制结构进行组合来实现。这三种基本的控制结构是顺序分支循环

拓展阅读 《数据结构实现基础》

3. 线性结构

线性表

线性表(Linear List)是由同一类型的数据元素构成的有序序列的线性结构

操作集:初始化、指定查找、查找、插入、删除、求表长

实现方式:顺序存储、链式存储

堆栈

堆栈(Stack)可以认为是具有一定约束的线性表,插入和删除操作都作用在一个称为栈顶(Top)的端点位置

操作集:生成栈、判断是否满、压栈、判断是否空、出栈

实现方式:顺序存储、链式存储

队列

队列(Queue)是一个有序线性表,队列的插入和删除操作分别是在线性表的两个不同的端点进行

操作集:生成队列、判断是否满、压入队列、判断是否为空,移除队列

实现方式:顺序存储、链式存储

4. 树

树(Tree)是一种十分重要且广泛应用的非线性数据结构

二叉树

五种基本形态:空二叉树、只有根节点的二叉树、只有根节点和左子树TL的二叉树、只有根节点和右子树TR的二叉树、具有根节点、左子树TL和右子树TR的二叉树

其它二叉树:斜二叉树、满二叉树、完美二叉树

实现方式:顺序存储、链式存储

操作集:创建二叉树、判断是否为空、遍历(先序遍历、中序遍历、后序遍历、层序遍历)

二叉搜索树

二叉搜索树(Binary Search Tree)是一种对排序和查找都很有用的特殊二叉树

定义:左子树 < 根节点 < 右子树

实现方式:一般用链表实现

操作集:创建二叉树、判断是否为空、遍历、查找、查找最小元素、查找最大元素、插入、删除

时间复杂度:最好 O(logN) 最差 O(N)

平衡二叉树

平衡二叉树(Balanced Binary Tree)又称为 AVL 树,AVL 树的插入、删除、查找操作均可在O(logN)时间内完成

定义:任一结点的左、右子树均为 AVL 树;根节点左、右子树高度差的绝对值不超过1

平衡二叉树的调整:单旋调整、双旋调整

树的应用

堆及其操作、哈夫曼树、集合及其运算

5. 散列查找

符号表(SymbolTable)是名字(Name)-属性(Attribute)对的集合,符号表最核心的操作是查找、插入和删除

操作集:创建符号表、查找指定名字是否存在、获取指定名字对应属性、更改指定名字对应属性、插入新名字及其属性、删除名字及其属性

使用散列技术实现符号表的操作集,符号表也叫做散列表(Hash Table,即哈希表),散列(Hashing)是一种重要的查找方法

散列函数(哈希函数):在查找数据时,由函数 h 对给定值 key 计算出地址,将 key 与该地址单元中数据对象关键字进行比较,确定查找是否成功。散列法又称为"关键字-地址转换法"

关键字分类:一般把关键字分为数字型关键字字符串型关键字

数字型关键字的散列构造
  • 直接定址法

h(key) = a x key + b (a、b为常数)

  • 除留余数法

h(key) = key mod p

  • 数字分析法

h(key) = atoi(key + 7)

字符串型关键字的散列构造
  • ASCII 码加和法

h(key) = (Σkey[i]) mode TableSize

冲突处理
  • 开放地址法

开放地址法就是一旦产生了冲突,即该地址已经存放了其它数据元素,就去寻找另一个空的散列地址

  • 链地址法

链地址法是将所有关键词为同义词的数据对象通过结点链接存储在同一个单链表中

  • 影响冲突的因素

散列函数是否均匀、处理冲突的方法、散列表的装填因子 α

6. 图

图的结构是任意两个数据对象之前都可能存在某种特定关系的数据结构

7. 排序

没有一种排序算法在任何情况下都是最优的,必须根据实际情况选择最优的算法来解决问题

算法稳定性:在一组待排序记录中,如果存在任意两个相等的记录 R 和 S,且在待排序记录中 R 在 S 前,如果在排序后 R 依然在 S 前,即它们的前后位置在排序前后不发生改变,则称为排序算法为稳定的

选择排序
  • 简单选择排序

简单选择排序(Simple Selection Sort)是一种直观的排序算法,在未排序的序列中,选出最小的元素和序列的首位元素交换,接下来在剩下的未排序序列中再选出最小元素与序列的第二位元素交换,依次类推,最后形成从小到大的已排序序列

时间复杂度:O(N2)

  • 堆排序

将无序的序列生成一个最大堆,将堆顶元素与最后一个元素对换位置,将剩下元素生成最大堆,依次进行元素交换并生成最大堆

时间复杂度:O(NlogN)
空间复杂度:O(1)

插入排序
  • 简单插入排序

将待排序的一组序列分为已排好序和未排序的两个部分,初始状态时,已排序序列仅包含第一个元素,未排序序列中的元素为除了第一个以外N-1个元素;此后将未排序序列中的元素逐一插入到已排序的序列中。如此往复,经过N-1次插入后,未排序序列中元素个数为0,则排序完成

时间复杂度:O(N2) 稳定排序

  • 希尔排序

将待排序的一组元素按一定间隔分为若干个序列,分别进行插入排序。开始时设置的"间隔"较大,在每轮排序中将间隔逐步减小,直到"间隔"为1,也就是最后一步是进行简单插入排序

时间复杂度:和增量序列的选取有关 非稳定排序

交换排序
  • 冒泡排序

对元素个数为 N 的待排序序列进行排序时,共进行N-1次循环。在第 k 次循环中,对从第1到第N-k个元素从前往后进行比较,每次比较相邻的两个元素,若前一个元素大于后一个元素,则两者互换位置,否则保持位置不变

时间复杂度:O(N2)

  • 快速排序

将未排序元素根据一个作为基准的"主元"分为两个子序列,其中一个子序列的记录均大于主元,而另一个子序列均小于主元,然后递归地对这两个子序列用类似的方法进行排序

时间复杂度:O(Nlog2N)

归并排序

将大小为 N 的序列看成 N 个长度为1的子序列,接下来将相邻子序列两两进行归并操作,形成N/2(+1)个长度为2(或1)的有序子序列;然后再继续进行相邻子序列两两归并操作,如果一直循环,直到剩下1个长度为 N 的序列,则该序列为原序列完成排序后的结果

时间复杂度:O(Nlog2N)
空间复杂度:O(N)

基数排序
  • 桶排序

如果已知 N 个关键字的取值范围是在 0 到 M-1 之间,而 M 比 N 小的多,则桶排序算法将关键字的每个取值建立一个"桶",即建立 M 个桶,在扫描 N 个关键字时,将每个关键字放入相应的桶中,然后按桶的顺序收集一遍就自然有序了

  • 基数排序

基数排序是桶排序的一种推广,它所考虑的待排记录包含不止一个关键字

8. 补充

9. 经典算法题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt中的绝对位置与相对位置

在Qt的开发中&#xff0c;有时候需要获取鼠标点击的位置的坐标。在Qt中坐标分为相对坐标和绝对坐标&#xff1b;相对坐标是以控件的左上角为&#xff08;0&#xff0c;0&#xff09;点的坐标系的坐标&#xff0c;绝对坐标是以显示器屏幕的左上角为&#xff08;0&#xff0c;0&a…

蓝桥杯-常用STL(二)

常用STL &#x1f388;1.集合&#x1f388;2.set的基础使用&#x1f52d;2.1引入库&#x1f52d;2.2插入元素&#x1f52d;2.3删除元素&#x1f52d;2.4判断元素是否存在&#x1f52d;2.5遍历元素&#x1f52d;2.6清空 &#x1f388;3.set与结构体 &#x1f388;1.集合 &#x…

【Algorithms 4】算法(第4版)学习笔记 04 - 2.1 初级排序算法

文章目录 前言参考目录学习笔记1&#xff1a;前置说明1.1&#xff1a;全序关系1.2&#xff1a;Comparable API 实现 demo1.3&#xff1a;排序算法模板2&#xff1a;选择排序2.1&#xff1a;内循环实现过程拆解2.2&#xff1a;代码实现2.3&#xff1a;特点3&#xff1a;插入排序…

【kubernetes】集群网络(二):Flannel的VxLan、Host-GW模式

文章目录 1 Pod的IP地址的分配2 CNI3 Flannel3.1 Flannel的安装3.2 VxLan3.3 Host-GW 4 总结 1 Pod的IP地址的分配 当节点上只安装了docker&#xff0c;则会用veth pairdocker0实现单个节点上容器之间的通信&#xff0c;并且这些容器都在同一个IP段&#xff0c;如果不修改&…

(2024,SaFaRI,双三上采样和 DFT,空间特征和频率特征)基于扩散模型的图像空间和频率感知恢复方法

Spatial-and-Frequency-aware Restoration method for Images based on Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 修改数据保真度 3.2 …

JMeter GUI:测试计划和工作台

什么是测试计划&#xff1f; 测试计划是您添加 JMeter 测试所需元素的地方。 它存储运行所需测试所需的所有元素&#xff08;如线程组、计时器等&#xff09;及其相应的设置。 下图显示了测试计划的示例 测试计划是您添加 JMeter 测试所需元素的地方。 它存储运行所需测试…

Modbus协议学习第六篇之基于libmodbus库的示例程序(可以联合Modbus模拟仿真软件进行调试)

前置工作 学了这么多Modbus的知识&#xff0c;如果不进行实际的操作&#xff0c;总感觉懂的不透彻。基于此&#xff0c; 本篇博文就带各位读者来了解下如何通过编写程序来模拟与Modbus Slave仿真软件的通讯。当然了&#xff0c;这里有两个前提&#xff0c;如下&#xff1a; 1.请…

【深度强化学习】Python:OpenAI Gym-CarRacing 自动驾驶 | 提供项目完整代码 | 车道检测功能 | 路径训练功能 | 车辆控制功能

💭 写在前面:本篇是关于 OpenAI Gym-CarRacing 自动驾驶项目的博客,面向掌握 Python 并有一定的深度强化学习基础的读者。GYM-Box2D CarRacing 是一种在 OpenAI Gym 平台上开发和比较强化学习算法的模拟环境。它是流行的 Box2D 物理引擎的一个版本,经过修改以支持模拟汽车…

一键部署幻兽帕鲁服务器免费一年方案

一、背景介绍 简单讲一下历程&#xff0c;幻兽帕鲁从在1月19日上线&#xff0c;24小时内在线人数峰值便突破200万&#xff0c;作为2024年第一款现象级游戏&#xff0c;《幻兽帕鲁》上线后&#xff0c;由于人数太多&#xff0c;频现服务器过载导致游戏卡顿掉线的情况。为了能够…

【GitHub项目推荐--大语言模型课程】【转载】

Large Language Model Course Large Language Model Course&#xff08;大型语言模型课程&#xff09;是一个开源项目&#xff0c;该课程分为三个部分&#xff1a; LLM 基础&#xff1a;涵盖了数学、Python 和神经网络的基础知识。 LLM 科学家&#xff1a;专注于学习如何使用…

Linux调优相关命令汇总

Linux调优相关命令汇总 TIPS 本文基于CentOS 7编写&#xff0c;理论支持所有所有版本Linux发行版&#xff0c;部分命令的个别参数在不同版本中可能存在细微的差异。 入门级 # 切换目录 cd # 示例 # 切换到上一层目录 cd .. # 切换到/opt/software cd /opt/software# 显示工作目…

【机器学习】基于K-近邻的车牌号识别

实验四: 基于K-近邻的车牌号识别 1 案例简介 ​ 图像的智能处理一直是人工智能领域广受关注的一类技术&#xff0c;代表性的如人脸识别与 CT 肿瘤识别&#xff0c;在人工智能落地的进程中发挥着重要作用。其中车牌号识别作为一个早期应用场景&#xff0c;已经融入日常生活中&…

LVGL部件7

一.图片部件 1.知识概览 2.函数接口 1.lv_img_set_pivot 在LVGL&#xff08;LittlevGL&#xff09;中&#xff0c;要设置图像对象的旋转中心点&#xff0c;可以使用 lv_img_set_pivot 函数。该函数的原型如下&#xff1a; void lv_img_set_pivot(lv_obj_t * img, lv_coord_…

Flask框架开发学习笔记《5》简易服务器代码

Flask框架开发学习笔记《5》 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 简易服务器代码 接口解析那一块很关键&#xff0c;学后端服务器这一块&#xff0c;感觉主要就是学习相应地址的接口怎么处理。 然后写清楚每个地址…

在centos 7 中安装配置Jdk、Tomcat、及Tomcat自启动

目录 一、安装配置Jdk 1.创建目录并上传文件 2.解压JDK压缩包 3.配置JDK环境变量 4.设置环境变量生效 二、安装配置Tomcat 1.上传Tomcat并解压 2.启停Tomcat 3.修改tomcat-user.xml配置 4.配置远程访问Tomcat 5.远程项目发布 三.Tomcat自启动配置 1.配置Tomcat自启…

链表的删除和预处理

创建空链表&#xff1a; struct Node head - - - 创建了头链表&#xff0c;内部不储存数据&#xff0c;地址为null&#xff0c;空间开在栈上&#xff08;在main函数里创建新的节点&#xff0c;一般都开在堆上&#xff09;。 函数不能返回局部变量的地址,因为局部变量的空…

各大厂急招鸿蒙开发员,争抢鸿蒙工程师

余承东宣布鸿蒙原生应用全面启动&#xff0c;华为开始了全面抛弃安卓的进程。 多家互联网公司也发布了鸿蒙OS的App开发工程师的岗位&#xff0c;开启了抢人大战。 有的企业开出了近百万的年薪招聘鸿蒙OS工程师&#xff0c;而华为甚至为鸿蒙OS资深架构师开出了100万-160万元的…

SASS 官方文档速通

前言&#xff1a;参考 Sass 中文网。 一. 特色功能 Sass 是一款强化 CSS 的辅助工具&#xff0c;在 CSS 语法的基础上增加了变量、嵌套、混合、导入等高级功能。有助于组织管理样式文件&#xff0c;更高效地开发项目。 二. 语法格式 .scss 拓展名&#xff1a;在 CSS3 语法的基…

二分图板子

原理&#xff1a; 匈牙利算法&#xff1a;二分图最大权匹配 - OI Wiki 简单说就是挨个找&#xff0c;找到就退出。后面的来了就让前面的挪位置。 板子&#xff1a; book指给u找位置时&#xff0c;有人考虑过的位置就不考虑了。 match[ i ]就是i位置对应的人。 e是关系 …

k8s helm安装Tiller出错解决

安装Helm 安装Helm通常使用一下命令&#xff1a; [rootk8s-master ~]# curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent …