数据结构与算法
王小c
交流群:954614622
weixin:wangc_20171010
qq:947790973
个人网站 dev.wangc.site
展开
-
PAT 害死人不偿命的(3n+1)猜想
1001 害死人不偿命的(3n+1)猜想 (15 分)卡拉兹(Callatz)猜想:对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……我们今天的题目不是证明卡拉兹原创 2020-06-05 22:16:38 · 414 阅读 · 0 评论 -
最大子列和问题
最大子列和问题问题陈述: 给定N个整数的序列{A1, A2, … , AN},求函数ƒ(i, j) = max{0, Ai + Ai+1 + … + Aj}(1<=i<j<=N)的最大值。算法1:计算每个子列的和时间复杂度: T(N) = O(N2)int MaxSubSeqSum(int arr[], int n) { int i, j, currentSum, maxSum = 0; for(i=0; i<N-1; i++) { /* i是子列原创 2020-06-05 22:14:02 · 119 阅读 · 0 评论 -
链表合并
下面三道关于合并的题用到主要的思路是——设置3个指针pa、pb和pc,其中pa和pb分别指向当前带比较插入的节点,而pc指向LC当前最近插入的一个节点,然后顺序可以通过前插后插来控制,重复元素的去留可以通过多一次判断解决。习题1 将两个非递减有序链表合并为一个非递减的有序链表,要求结果链表仍使用原来两个链表的存储空间。void MergeSqList(LinkList LA, LinkList LB, LinkList &LC){ LNode *pa = LA->next; L.原创 2020-06-05 22:12:37 · 350 阅读 · 0 评论 -
算法复杂度分析
时间复杂度算法时间的度量一个用高级语言编写的程序所耗费的时间一般取决于:算法设计问题规模所使用高级语言编译程序(解释程序)硬件速度1. 问题规模与语句频度不考虑计算机软硬件等环境因素,影响算法时间代价最主要的因素是问题规模,或者说它是问题规模的函数f(n)。问题规模是算法求解问题输入量的多少,一般用整数n表示,而问题规模n对不同的问题含义不同。算法执行时间 = 语句执行时间的总和,语句执行时间 = 语句的执行次数(频度)*执行一次时间。一条语句重复执行的次数称作原创 2020-06-05 22:08:15 · 927 阅读 · 0 评论 -
递归
一, 采用递归算法解决的问题所谓的递归是指,若在一个函数、过程或者数据结构定义的内部又直接或间接出现定义本身的应用,则称它们是递归的,或者是递归定义的。一下三种情况,常常使用递归的方法。定义是递归的递归定义的函数总有一个基本项和递归项,对应于递归算法中的终结状态与归纳项。例 1:阶乘函数long Fact( long n ){ if(n == 0) return 1; // 递归终结的条件 else return Fact(n-1); //原创 2020-06-05 22:04:24 · 357 阅读 · 0 评论 -
线性结构查找算法
顺序typedef struct LNode *List;struct LNode { ElementType Element[MAXSIZE]; int Lenght;};// 一般方法int SequentialSearch (List Tbl, ELementType K){ int i; for(i = Tbl->Lenght; i>0 && Tbl-<Element[i]!=K; i--); return 0;原创 2020-06-05 21:56:05 · 179 阅读 · 0 评论 -
排序算法竟能如此美丽?排序算法可视化大全!
文章目录首荐:VisuAlgo各算法对比最炫酷的比较聪明的最古老的开源的Javascript程序我的方法(伪):折线可视化开源Python脚本舞蹈可视化内存状态可视化首荐:VisuAlgo可视化网站首先推荐VisuAlgo,上面的可视化比较全了,做的也很漂亮。排序算法用条形图表示数值,数据可以自定义,允许用户查看正在进行的所有操作。链接:https://visualgo.net/sorting各算法对比这个网页综合比较各种常见的排序算法在不同情况下的排序效率。链接:https://ww原创 2020-06-05 21:52:16 · 2666 阅读 · 0 评论 -
Day108 树形结构查找算法
二叉搜索树(二叉排序树):元素有大小顺序的二叉树,左子树小,右子树大平衡二叉树:二叉排序树的改进B树:与二叉树查找相似,区别在于根据多路分支确定,m阶B树每个节点至多有m棵子树(即至多有m-1个关键字)B+树:叶子节点才是排序信息红黑树:红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉查找树。也就意味着,树的键值仍然是有序的。 特点:速度特别快,趋近平衡树,查找叶子元素最少和最多次数不多于二倍 ...原创 2020-06-02 20:02:30 · 631 阅读 · 0 评论 -
Day107 散列结构查找算法
哈希算法:也称为哈希查找算法,使用了哈希表作为存储结构,对比其他数据结构的查找算法,哈希查找是根据关键字计算关键字在表中的地址,而其他查找关键字和地址之间是没有关系的。理想情况下查找时间复杂度为O(1),因为与散列表中的元素个数n无关,即使会因为冲突处理有些多找几次,那也与n无关。 散列函数:(关键字——>对应地址)的函数常用方法有:直接定址法,除留余数法等 冲突处理:多个关键字通过散列函数得到相同地址,称作冲突。任何设计出的散列函数都不可避免会产生冲突,因此必须考虑冲突发生后如何处理。即为产生冲原创 2020-06-02 19:53:59 · 280 阅读 · 0 评论 -
Day22 队列
概念:队列是限制在一端插入,另一端删除的线性表 性质:队列的特点是先进先出(FIFO ) 实现:可以用数组或链表实现 优化:产生假溢出现象,合理利用空间,优化为循环队列...原创 2020-02-16 23:57:37 · 82 阅读 · 0 评论 -
Day19 稀疏矩阵
概念:矩阵中大部分元素为0,且分布没有规律时,则称稀疏矩阵 性质:这样的数组可以进行压缩存储,减少空间的占用。 方法:常用压缩方法有三元组法,邻接表,十字链表与违地址表示法 三元组法:把具有不同值的元素的行列及值记录在一个小规模的数组中 练习:用三元组法存储和还原系数矩阵package sparsematrix;/* 稀疏数组存储的思路(三元组法) 1. 遍历 原始的二维...原创 2020-02-12 12:18:24 · 177 阅读 · 0 评论 -
Day18 数据结构与算法_概述
数据结构学科:研究数据与组织数据方式的学科 数据结构:相互间存特定关系的数据元素的集合,包括三方面内容。 逻辑结构(数学结构) 线性结构:数组、队列、链表和栈 非线性结构:树形结构和图形结构 存储结构(物理结构):链式存储,顺序存储,散列存储,索引存储 基本操作:初始化,插入,判断非空,删除,查找等 算法理论:研究的如何更好更快的解决可计算问题的学科。 算法:解...原创 2020-02-11 11:59:30 · 100 阅读 · 0 评论 -
Day10 从头到尾打印链表
复习了一下链表,以前用C实现过,现在用Java实现了一下,实现了一些最基本的操作,并测试了一下。之后学到LinkedList类的时候再比较一下。 C/C++和Java还是有很多不同的,Java中全部都成了类,没有了结构体,也没有了头文件,也不需要指针,链表实现起来比C方便些。以后要总结一下两个高级语言的一些区别。package LinkList;public class LinkList...原创 2020-02-01 23:58:40 · 151 阅读 · 0 评论 -
Day8 替换空格
题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如,输入“We are happy. ”,则输出“We%20are%20happy. ”解决问题:用自带函数 str.replace(" ", "%20")。 多种解法:书上是在当前的字符串上进行替换,从前往后,每遇到一个空格就替换,后续数字都后移两个位置,推荐从后往前,先计算空格数量,这样只需要移动一次即可。 方法分析:首先是...原创 2020-01-29 16:37:30 · 103 阅读 · 0 评论 -
Day6 二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,、每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解决问题:首先遍历是可行的,左上角出发,先行后列,从左到右,从上到下。(效率O(m*n)) 多种解法:书上的解法是从右上角出发,每一次比较都可以舍弃一行或一列,类似二分法。(效率O(m*n)) 方法分析:首先矩阵的数字...原创 2020-01-27 20:17:16 · 100 阅读 · 0 评论 -
Day4 找出数组中重复的数字
最近疫情好严重,一周没出门了,今年过年也不串亲戚了,这样也很清静,安心下来学习就好了。关于数据结构与算法,基础比较差,感觉还是比较艰辛的,一道题目需要花几个小时才能差不多掌握了。目前感觉,学习解算法题可以分为这几个程度:解出题目:这是最基础的,对于基础算法题,也比较容易解出来。比如这道题,找到第一个数字和后面一个一个比,然后再换第二个重复操作,直到遍历完,这种很好想,但效率是O(n^2...原创 2020-01-25 15:48:46 · 171 阅读 · 1 评论