数据结构(三)——数据结构与算法概述

前言

  我们前面的两篇文章初步给大家介绍了数据结构与算法的工具推荐以及最常用最核心的十大排序算法。众所周知,数据结构与算法在计算机行业是最核心的,也是最基础的,当然在计算机的基础知识中,这部分内容是最难的,也是最枯燥的。因此,在第一篇文章我们介绍了一些关于帮助数据结构算法的核心思路的理解工具作了一些推荐。每当我们遇到较难的算法理解的时候,可以通过这些工具来借助理解。另外就是上一篇文章,我们介绍了一般最为常用的十大排序算法,通过了最为流行的三大语言进行介绍,分别用c语言、java语言设计、python来实现的。今天,我们就开始正式给大家详细介绍数据结构的相关内容,希望通过这些介绍,大家能够对数据结构与算法有一个更深的理解,同时也对大家的编程有一个质的提升。首先给大家介绍数据结构与算法的相关内容的介绍。

一、数据结构与算法相关内容介绍

1、经典的算法面试题

  • 1)、字符串匹配问题

  有一个字符串 str1="2021年我们将继续给大家创作有质量的文章,希望大家多多支持"和一个子串str2=“希望大家多多支持”
  现在要判断str1是否含有str2,如果存在,就返回第一次出现的位置,如果没有则返回-1。
  要求用最快的速度来匹配
  如果让你来匹配,你会怎么做?

  如果大家没有接触过数据结构的话,应该用的是最简单、最直接的方法,这里我们称这种最原始的方法为“暴力破解法”,这种方法最直接的优点就是实现起来较为简单,但是其缺陷也很明显,那就是执行的效率很低,另外当我们的规模较大的时候,其缺陷更加的明显。如果我们学完数据结构之后,在回过头来再看这些问题的时候,我们就会用到数据结构中一种典型的算法——KMP算法

  • 2) 汉诺塔问题

  首先这个问题是在数据结构中一个很经典的问题。请完成汉诺塔游戏的代码:要求:
1、将A塔的所有圆盘移动到C塔,并且规定在2小盘上不能放大圆盘,3在三根柱子之间一次只能移动一个圆盘。具体效果如下:
汉诺塔移动过程

  • 3)、 八皇后问题
      八皇后问题在数据结构中也是一个典型问题,它之所以经典是因为它所用的方法比较经典,用到了数据结构中很典型的回溯算法。该问题是由国际西洋棋手马克思·贝瑟尔于1948年提出:

  在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后均不能处于同一行、同一列或同一斜线上,问:有多少种摆法?

  其实这个问题亦可以用分治算法,具体如下:
八皇后棋盘
  八皇后算法介绍:

  ①、这里需要说明的是八皇后问题也叫马踏棋盘问题,这是指同一个问题。
  ②、将马随机放在国际象棋的8X8棋盘,当然我们数据结构下标一般是从0开始计算,因此,其棋盘的范围应该是[0~7][0-7],一共有64个方格,按照国际象棋的规则:马是走“日”字,要求每个方格只能进去一次,要走遍以上全部的64个方格。
  ③、具体实现其实是用到数据结构中的图的深度遍历算法(DFS)以及贪心算法的优化。
  ④、当然有心的程序员设计出了这个问题的一款游戏,大家有兴趣的话可以玩一下,增加对八皇后这个算法实现的理解。游戏页面如下:
马踏棋盘游戏界面

2、数据结构与算法的重要性

  通过上面的几个经典的问题介绍不难发现其实生活中的很多问题用到的都是算法中的核心问题,因此是算法是一个程序的灵魂,因此,一段优秀的程序可以针对含量的数据时候,仍然可以保持高速计算。一般来讲,程序会使内存计算框架(比如Spark技术)和缓存技术(比如redis技术)来优化我们的程序代码,接下来给读者留一个问题:

  刚才提到的这些框架以及缓存技术,它们的核心功能是哪个部分呢?

  根据日常的工作环境中,一般很多企业都是在Linux/Unix环境下开发的,很少有互联网企业用windows环境下直接做开发的,其上线的功能需要支持很多用户去使用的,因此,在上线之前会有一个测试的,这也就是我们找工作时,会有一个职位叫做测试工程师,就是测试上线前功能的bug。尤其是大公司,诸如阿里、腾讯、百度、京东等大公司,更是需要不断修改、优化产品,才能够在大量用户使用的时候不会出现卡顿等问题。其实不断升级优化的实质就是对程序的健壮性不断的完善,这就会用到了我们的算法。因此,数据结构与算法对我们计算机程序员来说是至关重要的,需要我们不断学习去掌握其中的精髓。一个好的程序员一定具备很好的算法功底,这是基础,因此,需要我们准确掌握。

二、数据结构和算法的概述

1、数据结构和算法的关系

  数据结构是一门研究组织数据方式的学科,其实早在有了编程语言的时候就有了数据结构,我们在前面也说了,学好数据结构可以使我们的代码更加的健壮,另外也可以增加有效率的代码。我们无论是学任何一个知识点都需要考虑其实用性。我们需要牢记一点,我们学任何的知识都是为了用,因此,我们在学数据结构的时候,要经常考虑如何生活中遇到的问题,我们用程序去实现解决。我们写的任何一个程序都是通过一定的数据结构和算法的有机结合。在数据结构与算法中,数据结构是算法的基础。

2、实际编程中的问题

  • 1、问题一:字符串替换问题
    具体代码如下:
public static void main(String[] args){
    
    
	String str = "java,python,Hello world!";
	String newStr = str.replaceAll("java","Stefan");
	System.out.println("newStr=" + newStr);
}

  这一小段java代码如果我们用数据结构中的单链表表示的字符串类及字符串结点类的定义,并依次实现它的构造函数、以及计算字符串长度、串赋值、判断两字符串相等、求字符串、两串连接、求字符在字符串中的位置等这些函数实现。

  • 2、问题二:一个五子棋程序
      这是一个很经典的程序,可以有很多的操作,具体来说,可以判断游戏的输赢,并可以完成存盘退出以及继续上局等功能。
  • 1、棋盘:我们是通过二维数组进行实现的,是通过稀疏数组然后写入文件,这就实现了存档的功能。
  • 2、我们读取之前存入的文件,然后将其放在稀疏数组之中,然后通过二维数组展示之前的棋盘,从而实现之前的接上局功能,其他的功能也类似。具体如图所示:

3、约瑟夫问题(丢手帕问题)

  这是一个很经典的问题。我们将其介绍一遍,Josephu问题具体如下:

  设编号为1,2,3……n的n个人围坐一圈,约定编号为k(1<=k<=m)的人从1开始报数,数到m的那个人队列,它的下一位又从1开始报数,数到m的那个人又出列,以此类推,直到所有人出列为止,由此产生一个出队编号的序列。

  针对这个问题,其实我们可以通过一个不带头结点的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表,然后由k个结点从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。因此,解决约瑟夫问题其实只需要使用数据结构中的单向循环链表即可。

4、线性结构和非线性结构

  数据结构包括两种结构,主要分为线性结构和非线性结构。线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。另外,线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表)。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的。链式存储的线性表称之为链表,链表中的元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息。线性结构常见的主要包括数组、链表、栈和队列。非线性结构主要包括:二维数组、多维数组、广义表、树结构以及图结构。

总结

  前两篇文章给大家介绍了数据结构与算法的工具推荐以及最常用最核心的十大排序算法,本文给大家介绍了数据结构与算法的基本概念,其中包括数据结构的重要性,以及数据结构与算法之间的关系,另外是通过几个经典的问题让大家对数据结构有一个整体的了解。最后给大家介绍了数据结构的线性结构以及非线性结构。其实数据结构与算法是特别重要的,在编程中有至关重要的地位,因此,需要我们特别的掌握。生命不息,奋斗不止,我们每天努力,好好学习,不断提高自己的能力,相信自己一定会学有所获。加油!!!

猜你喜欢

转载自blog.csdn.net/Oliverfly1/article/details/112093881