文章目录

  • 前言
  • 一、数据结构
    • 1.1 线性结构
    • 1.2 非线性结构
  • 二、数据结构与算法
    • 2.1 两者之间的关系
    • 2.2 两者重要性
  • 三、实际编程中遇到的问题
    • 3.1 单链表问题
    • 3.2 五子棋问题
    • 3.3 约瑟夫(Josephu)问题(丢手帕问题)
    • 3.4 其他常见算法问题
  • 四、几个经典的算法面试题()
    • 4.1 字符串匹配
    • 4.2 汉诺塔游戏
    • 4.3 八皇后问题
    • 4.4 马踏棋盘算法

前言

  • 2020.4.18日开始学习数据结构与算法。
  • 坚持每天两个小时,大约5.15日便可以学完。
  • 当天学习之前一定要复习之前所学习的,观看博客和代码。
  • 代码每天上传到GitHub上,传送门:https://github.com/fengfanli/dataStructuresAndAlgorithm
  • 本博客仅仅是开始,以后,争取每天一更新
  • 本博客的 实际编程中遇到的问题,几个经典算法问题,仅仅是学习前的了解,学完后面之后,再来解答。

一、数据结构

数据结构包括线性结构非线性结构

1.1 线性结构

  1. 线性结构作为最常用的数据结构,其特点数据元素之间存在一对一的线性关系
  2. 线性结构有两种不同的存储结构,即顺序存储结构链式存储结构
  3. 顺序存储的线性表称为顺序表,顺序表中的存储元素是连续
  4. 链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息`。
  5. 线性结构常见的有:数组、队列、链表和栈,后面我们会详细讲解.

1.2 非线性结构

非线性结构包括:二维数组,多维数组,广义表,树结构,图结构

二、数据结构与算法

2.1 两者之间的关系

  1. 数据data结构(structure) 是一门研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构可以编写出更加漂亮,更加有效率的代码。
  2. 要学习好数据结构就要多多考虑如何将生活中遇到的问题,用程序去实现解决.
  3. 程序 = 数据结构 + 算法
  4. 数据结构是算法的基础, 换言之,想要学好算法,需要把数据结构学到位。

2.2 两者重要性

  1. 算法是程序的灵魂,优秀的程序可以在海量数据计算时,依然保持高速计算
  2. 一般来讲 程序会使用了内存计算框架(比如Spark)和缓存技术(比如Redis等)来优化程序,再深入的思考一下,这些计算框架和缓存技术, 它的核心功能是哪个部分呢?
  3. 拿实际工作经历来说, 在Unix下开发服务器程序,功能是要支持上千万人同时在线, 在上线前,做内测,一切OK,可上线后,服务器就支撑不住了, 公司的CTO对代码进行优化,再次上线,坚如磐石。你就能感受到程序是有灵魂的,就是算法。
  4. 目前程序员面试的门槛越来越高,很多一线IT公司(大厂),都会有数据结构和算法面试题(负责的告诉你,肯定有的)
  5. 如果你不想永远都是代码工人,那就花时间来研究下数据结构和算法

三、实际编程中遇到的问题

3.1 单链表问题


图中问题问:试写出用单链表表示的字符串类及字符串结点类的定义,并依次实现它的构造函数、以及计算串长度、串赋值、判断两串相等、求子串、两串连接、求子串在串中位置等7个成员函数。

3.2 五子棋问题

  • 一个五子棋程序

  • 问:如何判断游戏的输赢,并可以完成存盘退出和继续上局的功能 棋盘->二维数组=>(稀疏数组)-> 写入文件 【存档功能】 读取文件-》稀疏数组-》二维数组 -》 棋盘 【接上局】

3.3 约瑟夫(Josephu)问题(丢手帕问题)

  • 问题:
    Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
    提示:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表(单向环形链表),然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。

3.4 其他常见算法问题

修路问题 => 最小生成树(加权值)【数据结构】+ 普利姆算法
最短路径问题 => 图+弗洛伊德算法
汉诺塔 => 分支算法
八皇后问题 => 回溯法

四、几个经典的算法面试题()

4.1 字符串匹配

  • 字符串匹配问题:
  1. 有一个字符串 str1= ““硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好””,和一个子串 str2=“尚硅谷你尚硅你”
  2. 现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1
  3. 要求用最快的速度来完成匹配
  • 思路:
  1. 暴力匹配
  2. KMP算法《部分匹配表》

4.2 汉诺塔游戏

  • 请完成汉诺塔游戏的代码: 要求:
  1. 将A塔的所有圆盘移动到C塔。
  2. 小圆盘上不能放大圆盘,
    3)在三根柱子之间一次只能移动一个圆盘
  • 思路:
  1. 使用分治算法

4.3 八皇后问题

  • 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。【92种】

  • 思路:

  1. 使用到回溯算法
  2. 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题

4.4 马踏棋盘算法

  • 马踏棋盘算法介绍和游戏演示
  1. 马踏棋盘算法也被称为骑士周游问题
  2. 将马随机放在国际象棋的8×8棋盘Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格
  3. 游戏演示: http://www.4399.com/flash/146267_2.htm
  • 思路:
  1. 会使用到图的深度优化遍历算法(DFS) + 贪心算法优化

数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题相关推荐

  1. 【图像融合学习笔记004】图像融合论文及代码网址整理总结(3)——题目中未加区分的图像融合算法

    写在前面的话: 之前写过两篇博文,针对性地整理汇总了多聚焦图像融合和红外与可见光图像融合的算法.之所以这样分类,是基于论文的标题和内容中明确指出了所处理的图像类型. 而本篇博文主要整理那些论文标题中未 ...

  2. mopso算法代码程序_JAVA程序员的必杀技,面试中常考的8个经典算法题,过程精妙,代码精炼...

    总有一些题,超越了岁月,即便是经过了新框架的层层迭代,它依然散发着令人回味无穷的味道.下面的几个笔试题目,是JAVA面试中经常遇见的,大家一定要牢记于心,可别复习到了到时候又说不出来.我就吃过这种亏, ...

  3. 什么是算法?如何学习算法?算法入门的学习路径

    何为算法 简单的说,算法就是:解决问题的手段,并且是批量化解决问题的手段. 比如,我们想要从成都去北京,起点就是成都,终点就是北京.如何去?我们就可以称为算法. 因此选择不同的算法,那么虽然终点都是一 ...

  4. 算法的深层次知识是数学,这些常用的互联网经典算法应用案例,你知道几个?

    前言 在文章初始,我们来思考一个很有意思的问题:一滴水从很高很高的空中自由落体下来,会不会砸伤人? 能够砸伤人则需要水滴具有的动能,即公式(1/2)mv^2,而水滴的质量是一定的,需要达到很高的速度时 ...

  5. 猴子偷桃c语言编程软件,c语言经典算法——猴子偷桃问题

    题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿 ...

  6. 从零学习数据结构与算法---基础与课前准备笔记

    这里开始学习 数据结构与算法相关知识,这个主要是基于 极客时间 大佬  覃超老师的 算法训练营 和  王争老师的 数据结构与算法之美.这里再次感谢两位老师,下面文章内容主要是自己作为复习使用的笔记,如 ...

  7. 算法导论 pdf_学习数据结构和算法最好的书是什么?

    ----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...

  8. 《算法图解》学习笔记(十一):十种经典的算法与数据结构

    python学习之路 - 从入门到精通到大师 文章目录 [python学习之路 - 从入门到精通到大师](https://blog.csdn.net/TeFuirnever/article/detai ...

  9. 20172328 2018-2019《Java软件结构与数据结构》第八周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第八周学习总结 概述 Generalization 本周学习了二叉树的另一种有序扩展?是什么呢?你猜对了!ヾ(◍°∇°◍) ...

最新文章

  1. out.print 嵌套html代码_Shiny与HTML
  2. 遍历同辈节电的方法_JQuery遍历DOM节点的方法
  3. mybatis plus 插入生成id_早点下班陪女朋友系列之Mybatis-plus代码生成器
  4. java的runtime error_Java常见的运行起异常(runtime exception)
  5. float、定位、inline-block、兼容性需注意的特性总结
  6. Java实验3 方法与数组
  7. 翻译是不是计算机常用的颜色模式,关于颜色的翻译
  8. Discuz仿集思街淘宝客网站模板/粉色淘客模板
  9. 定位神器:1秒定位DOM元素绑定的事件代码的位置
  10. 电路基础-交流电-正弦量和相量
  11. 【Leetcode】Customers Who Never Order
  12. 【JavaScript】鼠标、键盘的基础事件
  13. CentOS系统重新删除磁盘分区和挂载、开机自启(大于2T做法)
  14. vm虚拟机下ubuntu 联网方式
  15. 计算机二级excel中mid的用法,mid函数在excel中的使用方法
  16. BZOJ4398: 福慧双修【二进制分组+最短路】
  17. 半导体显示丨LG显示器广州OLED面板工厂下月投产
  18. 利用BI工具Tableau对豆瓣即将上映电影进行数据分析绘制图表
  19. Ubuntu下N卡配置无法保存的解决办法
  20. OpenCV去除绿幕 抠图

热门文章

  1. 之前做的一个关于支付安全的ppt,内容比较简单,分享给有需要的朋友。
  2. 将Excel中的数据转换成JSON格式
  3. AnyLink Vpn办公网部署,用于安全办公
  4. 洛谷 :P5236 【模板】静态仙人掌(圆方树模板 + 仙人掌最短路)
  5. ubuntu建立和删除软连接
  6. 大厂面试官:关于校招,你必须知道的那些事和建议
  7. Python一亿以内的素数个数_Python+django网页设计入门(17):模板语法及应用
  8. Trixbox分机间的手工呼叫转移功能的使用
  9. bat脚本实现按照月份对文件自动归档备份功能
  10. java 制作自定义控件_自定义控件的三种方式