【数据结构和算法】数据结构基础和算法思想

news2024/11/18 22:56:19

文章目录

    • 1. 基础的一些数据结构
        • (1)数组
        • (2)链表
        • (3)二叉树
        • (4)哈希表
    • 2. 有哪些常见的算法思想?
    • 3. 常见排序算法及其复杂度

1. 基础的一些数据结构

(1)数组

用于存储一组具有相同类型的元素,将相邻的元素存储在连续的内存位置中,这使得数组的访问和操作更加高效。数组的长度在创建时就确定,并且不能动态改变。需要存储更多元素时,必须创建一个新的数组。数组的元素通过下标来访问,下标从0开始,表示元素在数组中的位置。可以使用下标快速访问和修改数组中的元素。

(2)链表

链表链表是一种数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

非连续存储:链表中的节点可以在内存中的任何位置存储,它们通过指针相互连接,形成链式结构。

动态长度:链表的长度可以动态改变,可以在任何时候添加或删除节点,不受固定长度的限制。

通过指针访问:要访问链表中的元素,需要从头节点开始,通过指针依次访问每个节点,直到达到目标节点。

不需要连续空间:由于节点可以在内存中的任意位置存储,链表不需要连续的内存空间,可以更灵活地利用可用的内存。

插入和删除效率高:由于链表的动态性,插入和删除节点的操作相对高效。只需改变节点之间的指针连接,不需要像数组那样移动其他元素。

随机访问效率低:链表中的节点没有索引,无法像数组那样通过下标进行快速随机访问。必须从头节点开始遍历链表,直到达到目标位置。

额外的指针开销:链表中每个节点都需要一个指针来指向下一个节点,这会增加一定的额外内存开销。

可变的节点结构:链表的节点可以包含除数据之外的其他字段,如指向前一个节点的指针(双向链表)、标志位等,这使得链表可以支持更多的功能和操作。

(3)二叉树

二叉树(Binary Tree)是一种树状数据结构,其中每个节点最多有两个子节点:左子节点和右子节点。二叉树具有以下特点:

节点度数:每个节点最多有两个子节点,因此节点的度数(子节点的数量)不超过2。

有序性:二叉树中的子节点有顺序之分,通常将左子节点视为左边的节点,右子节点视为右边的节点。

结构简单:相比于其他树结构,二叉树的结构相对简单,易于理解和实现。
深度和高度:二叉树的深度指的是从根节点到最远叶子节点的层数,而高度指的是从最底层叶子节点到根节点的层数。树的深度和高度可以相等,也可以不相等。

空节点:二叉树中的某些节点可以是空节点(null或空指针),表示没有子节点的情况。

遍历方式:二叉树可以通过不同的遍历方式来访问其中的节点,包括前序遍历、中序遍历和后序遍历等。

二叉搜索树:二叉树中的一种特殊形式是二叉搜索树(Binary Search Tree),它满足左子节点的值小于父节点的值,右子节点的值大于父节点的值,因此可以用于高效的查找、插入和删除操作。

平衡性:二叉树的平衡性指的是左右子树的高度差不超过一个常数,例如平衡二叉树(AVL树)和红黑树等。

总结来说,二叉树是一种有序的树状数据结构,每个节点最多有两个子节点。它具有简单的结构,可以通过不同的遍历方式进行节点访问。二叉搜索树是二叉树的一种特殊形式,具有高效的查找、插入和删除操作。平衡二叉树保持左右子树的平衡性,提供更快的操作性能。

(4)哈希表

哈希表(Hash table)是一种数据结构,通过使用哈希函数将键映射到存储位置来实现高效的插入、查找和删除操作。哈希表具有以下特点:

高效的查找操作:哈希表利用哈希函数将键转换为存储位置(索引),从而实现常数时间复杂度(O(1))的查找操作。通过哈希函数,可以直接计算出键对应的存储位置,无需遍历整个数据集。

哈希函数映射:哈希函数将键映射到哈希表的存储位置。理想情况下,哈希函数能够将键均匀地映射到不同的存储位置,以最大程度地避免哈希冲突。

冲突处理:由于不同的键可能映射到相同的存储位置,哈希表需要处理冲突。常见的冲突解决方法包括链表法(使用链表存储冲突的键值对)和开放地址法(在发生冲突时寻找下一个可用的存储位置)等。

快速插入和删除操作:哈希表支持常数时间复杂度的插入和删除操作,因为通过哈希函数计算出存储位置后,可以直接访问到相应的位置并进行操作。

空间效率:哈希表的空间效率取决于数据集的填充因子(load factor),即存储的键值对数量与哈希表大小的比率。较低的填充因子可以减少冲突的概率,提高空间效率。

无序性:哈希表中的键值对通常是无序存储的,没有固定的顺序。如果需要有序性,可以使用其他数据结构或辅助数据结构。

可变长度:哈希表的长度(存储位置的数量)通常是可变的,可以根据需要进行动态调整,以适应数据集的大小变化。

总结来说,哈希表是一种高效的数据结构,具有快速的查找、插入和删除操作。它利用哈希函数将键映射到存储位置,解决了键值对的存储和查找问题。冲突处理和合理的填充因子可以影响哈希表的性能和空间效率。哈希表适用于需要快速查找和插入操作的场景,如缓存、索引和字典等。

2. 有哪些常见的算法思想?

以下是一些常见的算法思想:

贪心算法(Greedy Algorithm):在每个阶段选择当前看起来最好的选项,不进行回溯,以期望最终获得全局最优解。

分治算法(Divide and Conquer):将问题划分为更小的子问题,解决子问题并将结果合并,逐步解决原始问题。

动态规划(Dynamic Programming):将复杂问题分解为重叠的子问题,并使用记忆化技术或者构建状态表来避免重复计算,从而降低时间复杂度。

回溯算法(Backtracking):通过递归的方式尝试所有可能的解,并在搜索过程中剪枝,回退到上一个状态,以找到满足条件的解。

分支限界算法(Branch and Bound):通过剪枝策略和优先级队列,对搜索空间进行限制,减少搜索的范围,以找到最优解。

模拟退火算法(Simulated Annealing):受到冶金学中退火的过程启发,通过随机搜索和接受差解的策略,以概率性地跳出局部最优解,寻找全局最优解。

遗传算法(Genetic Algorithm):受到生物进化的启发,使用遗传操作(选择、交叉和变异)来模拟进化过程,以找到问题的最优解。

深度优先搜索(Depth-First Search,DFS):通过深度优先的方式遍历图或树的所有节点,递归或使用栈来实现。

广度优先搜索(Breadth-First Search,BFS):通过广度优先的方式遍历图或树的所有节点,使用队列来实现。

二分查找(Binary Search):对于有序数组或有序列表,通过比较中间元素与目标元素的大小关系,将搜索范围缩小一半,以快速定位目标元素。

3. 常见排序算法及其复杂度

在这里插入图片描述

插入排序(Insertion Sort):将未排序的元素逐个插入到已排序部分的合适位置,直到整个序列有序。

选择排序(Selection Sort):每次从未排序的部分选择最小(或最大)的元素,放到已排序部分的末尾,直到整个序列有序。

堆排序(Heap Sort):将序列构建成一个最大堆(或最小堆),然后将堆顶元素与最后一个元素交换并移除,重新调整堆,重复此过程直到整个序列有序。

希尔排序(Shell Sort):将序列按照一定间隔分组,对每个分组进行插入排序,然后逐渐缩小间隔,重复插入排序操作,直到间隔为1,完成最后一次插入排序。

桶排序(Bucket Sort):将元素根据值的范围划分为多个桶,然后将元素放入对应的桶中,再对每个桶中的元素进行排序,最后按照桶的顺序依次取出元素。

冒泡排序(Bubble Sort):重复地比较相邻的两个元素,如果顺序不对则交换,直到整个序列有序。

快速排序(Quick Sort):通过选择一个基准元素,将序列分割为两个子序列,其中一个子序列的元素均小于基准元素,另一个子序列的元素均大于基准元素,然后对子序列进行递归排序。

归并排序(Merge Sort):将序列递归地分成两个子序列,分别对子序列进行排序,然后将两个有序子序列合并为一个有序序列。

基数排序(Radix Sort):将元素按照位数进行排序,从最低位到最高位依次进行比较和排序,直到最高位,最终得到有序序列。

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

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

相关文章

java多线程之定时器

文章目录 一、 简介1. 概念2. 定时器的使用 二、 常用方法介绍1. Schedule(TimTask task,Data time)2. Schedule(TimTask task,Data firstTime, long period)3. Schedule(TimTask task, long delay)4. Schedule(TimTask task, long delay, lo…

数据结构_排序

目录 1. 排序的基本概念 2. 插入排序 2.1 直接插入排序 2.2 折半插入排序 2.3 希尔排序 2.4 相关练习 3. 交换排序 3.1 冒泡排序 3.2 快速排序 3.3 相关练习 4. 选择排序 4.1 简单选择序列 4.2 堆排序 4.3 相关练习 5. 归并排序和基数排序 5.1 归并排序 5.2 基…

这几款实用的电脑软件推荐给你

软件一:TeamViewer TeamViewer是一款跨平台的远程控制软件,它可以帮助用户远程访问和控制其他计算机、服务器、移动设备等,并且支持文件传输、会议功能等。 TeamViewer的主要功能包括: 远程控制:支持远程访问和控制…

【Jenkins】Jenkins运行python脚本的简单操作(windows)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、…

Vue基础入门(中)

组件的定义 组件具备复用性 注意&#xff1a;全局组件&#xff0c;只要定义了&#xff0c;处处可以使用&#xff0c;性能不高&#xff0c;但是使用起来简单 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><me…

Linux下的用户分类与su/sudo 命令,Linux下的文件类型/用户文件权限身份/文件权限属性/权限与文件权限/ls-l文件属性详解

Tips 下载就是把我们的文件拷贝到系统的某个特定路径之下&#xff0c;普通用户是不允许你往系统里面去拷的。 Linux下的用户分类 root用户&#xff0c;管理员级别的用户身份&#xff0c;他的话基本上不受权限的约束。普通用户&#xff0c;普通用户的添加与每个普通用户密码的…

《面试1v1》JavaNIO

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a; 你好&#xff0c;我想问一下你对 Java NIO 的了解。 候选人&#xff1a; 当然&#xff0c;Java NIO 是 Java 的一种 I/O 模型&#xff0c;它提…

MapReduce【自定义分区Partitioner】

实际开发中我们可能根据需求需要将MapReduce的运行结果生成多个不同的文件&#xff0c;比如上一个案例【MapReduce计算广州2022年每月最高温度】&#xff0c;我们需要将前半年和后半年的数据分开写到两个文件中。 默认分区 默认MapReduce只能写出一个文件&#xff1a; 因为我…

「OceanBase 4.1 体验」OceanBase:解读领先的分布式数据库系统,功能与体验全解析

文章目录 前言一、关于 【OceanBase 4.1】征文活动&#xff08;可跳过&#xff09;二、OceanBase 产品了解2.1 初识 OceanBase2.2 什么是 OceanBase2.3 OceanBase 相关链接2.4 OceanBase 与传统数据库对比有何特别之处2.5 OceanBase 相关概念以及术语2.5.1 OceanBase 基本概念2…

接口测试总结及其用例设计方法整理,希望可以帮到你

目录 接口测试的总结文档 第一部分&#xff1a; 第二部分&#xff1a; 接口测试用例设计 接口测试的总结文档 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做…

ios中video标签兼容问题

案例 这是在实际开发中遇到的问题,产品给出的效果图如下: 其实就是一个h5页面中有很多视频, 但是我为什么都画着预览图呢? 因为在ios中video标签中尽管有src属性, 但是在没有预览图的情况下, 是一个灰蒙蒙的图层的, 很丑, 效果如下: 看到这里是不是很崩溃, 在PC端, 在安卓端…

RK3568平台开发系列讲解(Camera篇)快速了解RK Camera的使用

🚀返回专栏总目录 文章目录 一、MIPI CSI1.1 Full Mode特点1.2 Split Mode特点二、Full Mode配置2.1 配置sensor端2.2 csi2_dphy0相关配置2.3 isp相关配置三、Split Mode配置3.1 配置sensor端3.2 csi2_dphy1/csi2_dphy2相关配置3.3 isp相关配置四、软件相关目录

自然语言处理实战项目7-利用层次聚类方法做文本的排重,从大量的文本中找出相似文本

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目7-利用层次聚类方法做文本的排重&#xff0c;从大量的文本中找出相似文本。随着互联网技术的不断发展&#xff0c;越来越多的数据被广泛地应用在各个领域中。而文本数据是其中之一&#xff0c;…

ar在汽车维修行业的应用场景

由于AR增强现实技术的易用性&#xff0c;在汽车产业链中&#xff0c;已处处可见AR技术的踪影&#xff0c;像汽车设计AR远程协同&#xff0c;汽车装配AR远程指导&#xff0c;汽车维修AR远程协助等等&#xff0c;那么下面为详细介绍AR增强现实技术在汽车制造领域的应用。 环境/物…

实力在线 | 赛宁网安连续三年入选《中国网络安全市场全景图》

​​近日&#xff0c;国内专业安全机构数说安全正式发布了《2023年中国网络安全市场全景图》&#xff08;以下简称全景图&#xff09;。此次全景图分类架构涵盖了产品、解决方案、应用场景、服务4个维度&#xff0c;覆盖了目前我国网络安全行业所有成熟的细分市场。 赛宁网安凭…

Postman实现数字签名,Session依赖, 接口依赖, 异步接口结果轮询

Script(JS)为Postman赋予无限可能 基于Postman 6.1.4 Mac Native版 演示结合user_api_demo实现 PS 最近接到任务, 要把几种基本下单接口调试和持续集成一下, 做个常规功能验证, 研究了下发现, 不同的下单途径, 有的需要登录(Session依赖), 有的需要验签(使用数字签名的微服务),…

用本地机做跳板使服务器连接外网【mac】

用自己的电脑做跳板使服务器连接外网 前提整体流程连接服务器配置服务器配置自己的电脑 前提 很多时候我们的服务器只能联内网&#xff0c;但是没法登外网&#xff0c;这样pip&#xff0c;conda 啥的都没法用&#xff0c;很麻烦。 一个简单的解决方法就是用自己的电脑作为跳板…

补充点【数据分析统计学知识点】

数据分析所需的统计学笔记 0.数据分析师拿到数据 第一利器&#xff1a;描述性统计信息 第二利器&#xff1a;对比分析法 第三利器&#xff1a;指标体系-要素拆解&#xff0c;维度拆解 第四利器&#xff1a;相关分析 第五利器&#xff1a;趋势预测 1.均值 2.中位数 3.众数…

基于Java+SpringBoot+vue的口腔管家平台设计与实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

Hadoop 3.0.0的集群搭建和Hive 3.1.3的安装

Hi,朋友们&#xff0c;我们又见面了&#xff0c;这一次我给大家带来的是Hadoop集群搭建及Hive的安装。 说明一下&#xff0c;网上有很多的教程&#xff0c;为什么我还要水&#xff1f; 第一&#xff0c;大多数的安装都是很顺利的&#xff0c;没有疑难解答。 第二&#xff0c…