数据结构小结

数据结构,小结 · 浏览次数 : 8

小编点评

**个人观点:** 数据结构的偏向理论知识点可以帮助我们理解各种数据结构的特点和联系,进而在特定的场景下选择合适的结构来解决问题。例如,线性结构可以用于存储顺序数据,而非线性结构可以用于存储无序数据。 **数组和链表的优缺点:** **数组** * 优点: * 数组是线性结构,易于管理和访问。 * 数组可以用来存储具有相同类型的数据元素。 * 缺点: * 数组的访问效率随数据元素数量的增长而下降。 * 数组的插入和删除操作效率较低。 **链表** * 优点: * 链表是线性结构,易于管理和访问。 * 链表的插入和删除操作效率较高。 * 缺点: * 链表的访问效率随数据元素数量的增长而上升。 * 链表的存储空间开销可能高于数组。 **其他复杂数据结构的优势:** * **队列** * 队列是一种线性结构,元素可以按插入顺序访问。 * 队列的先进和后先进分别表示队列中元素的第一个元素和最后一个元素。 * **栈** *栈是一种线性结构,元素可以按先进出栈顺序访问。 * 栈的先进和后先进分别表示栈中元素的第一个元素和最后一个元素。 * **树** * 树是一种非线性结构,具有查找、插入和删除操作的方便性。 * 树的结构可以根据不同的排序方式进行排序。 * **图** * 图是一种非线性结构,用于存储相互关联的多个数据元素。 * 图的结构可以根据不同的排序方式进行排序。 **总结:** 数据结构的偏向理论知识点可以帮助我们了解各种数据结构的特点和联系,进而在特定的场景下选择合适的结构来解决问题。

正文

个人认为数据结构有点偏向理论知识点,从这些理论知识点,我们可以知道各种数据结构的特点,然后在特定的场景下使用对应的数据结构来存储。

基础的数据结构

从逻辑上来说基础的数据结构只有线性结构、非线性结构,也就是数组、链表。其他复杂一点的如队列、栈、树、图、hash table 都可以通过数组和链表的方式来存储。

有了数组、链表为什么还要有其他数据结构?

我的理解是出现队列、栈、树、图等数据结构的原因,是为了解决,部分问题处理过程中时间复杂度过高的问题,如我们在数组中如果想要更快的访问到先push 进去的数据,那么我们直接用队列即可。

数据结构与算法

我们通常说的数据结构是逻辑上数据与数据相互之间存在一种或多种关系的数据元素集合

算法是解决某种具体问题的方法、步骤

数据结构是静态的,它只是组织数据的一种方式,如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的、也没有意义。

数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构之上。

如当我们把数据存入数组中,有个需求我们需要把按照小到大排序展现出来,我们可以一个一个的比较(冒泡排序)。但是当数据量很大的时候,这种方法就很低效了,这个时候我们可以使用快排这样的算法。

常用算法思想

前面说算法是作用在特定的数据结构之上,在大部分的时候我们都是使用别人总结出来的一些方法、思想如:

  • 二分法
  • 双指针
  • 滑动窗口
  • 递归
  • 动态规划
  • 贪心算法
  • 回溯算法
  • 穷举法也叫枚举法

常见排序

排序是一个很常见的需求,我们可以通过冒泡、或者快排来解决。

冒泡:

const bubbleSort = (arr) => {
  if (arr.length <= 1) return
  for (let i = 0; i < arr.length; i++) {
      let hasChange = false
      for (let j = 0; j < arr.length - i - 1; j++) {
          if (arr[j] > arr[j + 1]) {
              const temp = arr[j]
              arr[j] = arr[j + 1]
              arr[j + 1] = temp
              hasChange = true
          }
      }
      // 如果false 说明所有元素已经到位
      if (!hasChange) break
  }
  console.log(arr)
}

递归版快排:

function quickSort (arr) {
  if (arr.length < 2) return arr
  let pivot = arr[0]
  let left = arr.slice(1).filter(t => t <= pivot)
  let right = arr.slice(1).filter(t => t > pivot)
  return [...quickSort(left), pivot, ...quickSort(right)]
}

递归的层级过多有可能造成内存泄露的风险,下面是优化之后的,在原数组中移动的快速排序。

原数组移动快排:

function quickSort2 (arr, left, right) {
  if (left < right) {
    let index = partition(arr, left ,right)
    // index 已经是正确的位置
    quickSort2(arr, left, index - 1)
    quickSort2(arr, index + 1, right)
  }
  return arr
}

// 分区:把基准值插入到正确的位置
function partition (arr, left, right) {
  let pivot = arr[left]
  let index = left + 1 // 待交换位置为左边+1

  // 左 ---> 右扫描
  for (let i = index; i <= right; i++) {
    // 小 ---->  大  小于放左边
    if (arr[i] <= pivot) {
      swap(arr, index, i)
      index++
    }
  }
  // 最后把基准值插入到合适的位置
  swap(arr, left, index -1 )
  return index - 1;
}

function swap (arr, i, j) {
  [arr[i], arr[j]] = [arr[j], arr[i]]
}

let list = [66,1,434,545,65,0,2,3,6,66,999,-1,22]
let arr = quickSort2(list,0,list.length)
console.log(arr)

还有很多的排序如插入排序、归并排序等可以自行了解。

总结

 数据结构、设计模式、网络这些还是挺重要的。

路漫漫其修远兮,吾将上下而求索。

与数据结构小结相似的内容:

数据结构小结

个人认为数据结构有点偏向理论知识点,从这些理论知识点,我们可以知道各种数据结构的特点,然后在特定的场景下使用对应的数据结构来存储。 基础的数据结构 从逻辑上来说基础的数据结构只有线性结构、非线性结构,也就是数组、链表。其他复杂一点的如队列、栈、树、图、hash table 都可以通过数组和链表的方式

剑指Offer 05. 替换空格(java解题)

leetcode中《图解数据结构》的刷题记录,包含解题思路、java代码的知识点小结和遇到的一些错误类型,与君共勉。

7个工程应用中数据库性能优化经验分享

摘要:此篇文章分别从sql执行过程、执行计划、索引数据结构、索引查询提速原理、聚焦索引、左前缀优化原则、自增主键索引这些角度谈一谈我们对数据库优化的理解。 本文分享自华为云社区《工程应用中数据库性能优化经验小结》,作者: 叶工 。 1、前言 现阶段交付的算法产品,绝大多数涉及到数据库的使用。它承载的

数据结构与算法 #18 下跳棋,极富想象力的同向双指针模拟

> ⭐️ **本文已收录到 [AndroidFamily](https://github.com/pengxurui/AndroidFamily),技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问。** > > 学习数据结构与算法的关键在于掌握问题背后的算法思

数据结构(四):(顺序表)设计算法删除所有数字字符

好家伙,写作业 什么是顺序表: 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、 使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系, 采用顺序存

数据结构(二):括号匹配(C++,栈)

好家伙,写题,题目代码在最后 来吧, 1.栈 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。 这一端被称为栈顶,相对地,把另一端称为栈底。 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素; 从一个栈删除元素

数据结构(三):舞伴配对问题(C++,队列)

好家伙, 题目如下: 1.舞伴配对问题:假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。 2.若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。要求编写程序,模拟上述舞伴配对问题,且规定: 程序的输入时:进入舞厅人员的姓名和

数据结构作业(五):直接插入排序 和 归并排序

好家伙,写作业 1.直接插入排序 这是个非常简单的排序 将一串数分为有序区和无序区 然后将无序区的数一个个按照正确的顺序放到有序区 2.归并排序 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 若将两个有序表合并成一个有序表,称为二路归并。 其中我们要解决的一个

数据结构与算法大作业:走迷宫程序(C语言,DFS)(代码以及思路)

好家伙,写大作业,本篇为代码的思路讲解 1.大作业要求 走迷宫程序 问题描述: 以一个 m * n 的长方阵表示迷宫, 0和1分别表示迷宫的通路和障碍。 设计一个程序, 对任意设定的迷宫, 求出一条从入口到出口的通路, 或得出没有通路的结论。 基本要求: (1) 实现一个以链表做存储的栈类型, 然后

数据结构与算法大作业:走迷宫程序(实验报告)

好家伙,本篇为应付老师的实验报告,有需要的拿去抄吧 思路讲解在上一篇: 数据结构与算法大作业:走迷宫程序(C,代码以及思路) 一、作业目的 1、 掌握用数据结构的知识进行程序设计。 2、 应用所学的数据结构完成一个具有一定实际意义的应用程序的设计、编码、调试,锻炼实践动手能力,提高编程水平。 二、作