数据结构小结

数据结构,小结 · 浏览次数 : 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、前言 现阶段交付的算法产品,绝大多数涉及到数据库的使用。它承载的

[转帖]Redis实战总结

数据结构 数据结构是Redis的实体,承载着内部数据的存储,理解数据结构有利于我们对Redis存储进行优化,所以需要重点去理解. object encoding key查看键值类型的编码. 数据结构内部编码说明stringraw小于39个字节字符串int8个字节长整型,只有当key为整型才会被存储e

[转帖]各种数据结构性能的比较

数据结构包括数组、链表、栈、二叉树、哈希表等等 数据结构优点缺点数组插入快查找慢、删除慢、大小固定有序数组查找快插入慢、删除慢、大小固定栈后进先出存取其他项很慢队列先进先出存取其他项很慢链表插入、删除快查找慢二叉树查找、插入、删除快算法复杂(删除算法)红黑树查找、插入、删除快算法复杂hash表存取极

[转帖]redis数据结构详解之Hash(四)

https://www.cnblogs.com/Alex80/p/5320091.html 序言 Hash数据结构累似c#中的dictionary,大家对数组应该比较了解,数组是通过索引快速定位到指定元素的,无论是访问数组的第一个元素还是最后一个元素,所耗费的时间都是一样的,但是数组中的索引却没有实

[转帖]Linux IO调度之队列、队列深度

有关数据结构 请求队列:struct request_queue 请求描述符:struct request 队列深度 可以在端口队列中等待IO请求数量; 具体代表其值的是request_queue的成员nr_requests:存放了每个数据传送方向的最大请求个数; nr_requests在Linux

[转帖]Redis入门(数据结构基础,分布式锁,性能调优)

目录 1、Redis基础 1.1 Redis是啥?能干啥? 1.2 安装Redis 1.3 Redis集成Spring 入门Demo 1.4 Redis支持数据类型 2、分布式锁解决方案-Redis(略) 3、Redis性能调优军规 3.1 缩短键值对的存储长度 3.2 使用 lazy free(延

递归在多级数据结构中的简单应用

哈喽,我是小码,半年多没更新了,这段时间换了新工作,工作也很忙。后续会尽量多写点,坚持确实是一件很难,很酷的事情。最近在公司负责开发商品有关的开发,商品包含类型、款式等属性,而类型可能有一级类型、二级类型甚至是三级类型,针对这种多级分类,这就就不好使用简单的查询了。之前也写了一篇文章,Java递归实

NumPy 数组创建方法与索引访问详解

NumPy 创建数组 NumPy 中的核心数据结构是 ndarray,它代表多维数组。NumPy 提供了多种方法来创建 ndarray 对象,包括: 使用 array() 函数 array() 函数是最常用的方法之一,它可以将 Python 列表、元组甚至其他数组转换为 ndarray 对象。 语法