
算法之美
Tom Hardy
关注计算机视觉、机器学习、深度学习,公众号【3D视觉工坊】【计算机视觉工坊】
展开
-
二叉树
树的定义线性表、栈、队列都是线性结构,而树是一种非线性结构。树是n个结点的有限集,当n=0时,成为空树。树的存储方法1.双亲表示法假设以一组连续空间存储树的结点,同时在每个结点中,附设一个指示其双亲结点在数组中位置的元素。也就是说,每个结点除了知道自己是谁之外,还知道它的parent在哪里。这样的存储结构,可以根据某结点的parent指针找到它的双亲结点,所用的时间复杂度是O(1),索引到...原创 2018-10-01 12:56:47 · 416 阅读 · 0 评论 -
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路对二进制中的每一个数字进行查询,看是否为1,并对判断后的二进制串进行左移操作,直到所有二进制串中所有的数字被遍历。源代码class Solution {public: int NumberOf1(int n) { int count=0; uns...原创 2019-04-20 21:22:38 · 415 阅读 · 0 评论 -
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则
题目介绍输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。题目分析其实就是两个链表进行合并,如果有一个链表为空,则直接返回另外一个链表;否则就对两个链表的每个元素进行大侠判断,建立一个新的合并链表,把元素依次放进去,直到一个链表为空,这时把另外一个链表的剩余部分添加到合并链表的尾部即可。源代码注意里面使用了递归。。。/*struct List...原创 2019-04-23 10:27:38 · 849 阅读 · 0 评论 -
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList
源代码/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x), next(NULL) {* }* };*/class Solution {public: vector<...原创 2019-04-18 14:42:45 · 566 阅读 · 0 评论 -
汉诺塔问题(非常简单明了的解析)
问题介绍汉诺塔是一个经典问题,如下图所示,考虑的是如何把A中的方块完全移动到C上,而且在移动的过程中可以借助B,但是要保证,总是小的圆块放到大的圆块上。网上关于这类问题已经有很多解析方案了,但是对初学者来说不够简单明了,这里会用图示的方法一步一步带你了解源代码#include<iostream>using namespace std;void move(int n, c...原创 2019-04-30 11:01:47 · 6686 阅读 · 6 评论 -
AOV和AOE之间的区别和联系
1、AOV网定义:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们成为AOV网(Activity On Vertex Network),AOV网中的弧表示活动之间的某种约束关系。AOV网中不存在回路(即无环的有向图)。拓扑排序定义:设G(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,…,vn,满足若从顶点vi到vj有一...转载 2019-06-06 09:40:59 · 18714 阅读 · 0 评论 -
中缀表达式转后缀表达式(非常简单易懂)
前言数据结构与算法中经常遇到中缀表达式转前缀表达式的题目,网上的教程大都很不直观,自己学的时候,也走了很多弯路,现在把一个简单易懂的算法教程分享出来。中缀转后缀举个例子,一个式子:(5+20+1∗3)/14(5+20+1*3)/14(5+20+1∗3)/14如何把该式子转换成后缀表达式呢?其实就是分三步:1、按运算符优先级对所有运算符和它的运算数加括号,(原本的括号不用加)2、把运算...原创 2019-06-25 20:08:17 · 20734 阅读 · 18 评论 -
后缀表达式转中缀表达式(非常简单易懂)
介绍最近刷题,看到了很多后缀转中缀的题目,查了一些网上的教程,在这里做了一个简单详细的说明。关于中缀转后缀请看我的另外一篇博客。后缀转中缀举个例子~对于后缀表达式ABCD−∗+EF/−ABCD-*+EF/-ABCD−∗+EF/−,它的中缀表达式该怎么求呢?其实很简单,下面将会一步一步讲解:1、把后缀表达式逐个元素的压入到栈中,当压入的都是字符,则不采取任何操作,当压入的是运算符,则把运算符...原创 2019-06-25 20:43:59 · 35990 阅读 · 9 评论 -
给定一列非负整数,求这些数连接起来能组成的最大的数。
题目介绍给定一列非负整数,求这些数连接起来能组成的最大的数。输入描述:第一行n>0是一个正整数,表示一共有n个输入。以后每行是一个非负整数,共有n行。输出描述:n个输入的非负整数连接成的最大的数输入例子1:69876543输出例子1:9876543输入例子2:2112输出例子2:211题目分析# include <iostrea...转载 2019-06-28 13:32:22 · 2326 阅读 · 0 评论 -
手撕代码之快速排序算法(简单明了)
介绍快速排序算法是一个很受欢迎的不稳定排序算法,在数据完全无须的情况下,最容易发挥其长处,此时的时间复杂度为nlognnlognnlogn,当数据在完全有序的情况下,此时的时间复杂度为n2n^2n2,另外快速排序的空间复杂度也很高哦,为O(log2n)O({log_2}n)O(log2n)∼\sim∼O(n)O(n)O(n)之间,是除了基数排序中,空间复杂度最高的算法,这是典型的空间换时间的算...原创 2019-07-05 10:44:27 · 523 阅读 · 0 评论 -
C++实现选择排序
源代码#include<iostream>#include <vector>using namespace std;void choose_sort(vector<int>& point){ int min_num; int flag = 0; for (int i = 0; i < point.size(); i++) {...原创 2019-07-12 11:51:01 · 234 阅读 · 0 评论 -
C++实现插入排序
源代码#include<iostream>#include <vector>using namespace std;void insert_sort(vector<int>& point){ int temp; for (int i = 1; i < point.size(); i++) { temp = point[i];...原创 2019-07-12 12:17:08 · 409 阅读 · 0 评论 -
哈希函数的构造方法以及哈希表解决冲突的方式
哈希表哈希表的思想就是在待查记录的关键字值和它的存储位置之间建立一个确定的对应关系则查找时不必再进行关键字值间的比较。根据设定的哈希函数及处理冲突的方法将查找表中各数据元素存储在一段有限的连续空间中,即得哈希表。这里有两个比较重要得问题:哈希函数的构造、处理冲突的方法。哈希函数的构造方法1、直接定址法直接根据数据的值来映射到地址,比如对数字10、11、12、13…可以将其映射到一块连续...原创 2019-03-31 16:34:43 · 4718 阅读 · 1 评论 -
十字链表
十字链表的好处就是因为把邻接表和逆邻接表整合在一起,这样既容易找到以vi为尾的弧,也容易找到以vi为头的弧,因而容易求得顶点的出度和入度。...原创 2019-03-02 18:44:47 · 383 阅读 · 0 评论 -
拓扑排序
前言在前面讲解的线性表中,每个元素之间只有一个直接前驱和一个直接后继,在树形结构中,数据元素之间是层次关系,并且每一层上的数据元素可能和下一层中多个元素相关,但只能和上一层中一个元素相关。图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。线性表中我们把数据元素叫做元素,树中叫结点,在图中数据元素我们称之为顶...转载 2018-10-03 11:31:13 · 211 阅读 · 0 评论 -
算法原理之排序算法
冒泡排序的基本思想:两两相邻记录的关键字,如果反序则交换,知道没有反序的记录为止。冒泡排序要点:两两注意是相邻的两个元素的意思。如果有n个元素需要比较n-1次,每一轮减少1次比较。既然叫冒泡排序,那就是从下往上两两比较,所以看上去就跟泡泡往上冒一样。...原创 2018-10-05 19:20:47 · 229 阅读 · 0 评论 -
图的深度优先遍历和广度优先遍历
图的深度优先遍历和广度优先遍历1.深度优先遍历如下图所示,深度优先搜索就是从初始节点出发,依次向邻接顶点遍历,邻接顶点进行递归,接着向邻接顶点的邻接顶点遍历,直至全部顶点遍历结束,最终返回主节点。...转载 2018-09-28 09:56:09 · 623 阅读 · 0 评论 -
约瑟夫问题
据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀的方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不像遵从,Josephus要他的朋友先假装遵从,...原创 2018-09-28 12:10:06 · 202 阅读 · 0 评论 -
线性表之顺序存储结构和链式存储结构
线性表包括顺序表和链表,其中链表又包括单链表、循环链表、双向链表。顺序存储结构和链式存储结构有所不同,具体区别如下表所示:通过上面的对比,可以得出一些经验性的结论:若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。若需要频繁插入和删除时,宜采用单链表结构。当线性表中的元素个数变化较大或者根本不知道有多大时,最好用单链表结构,这样可以不需要考虑存储空间的大小问题。而如果...转载 2018-09-28 14:17:06 · 37739 阅读 · 2 评论 -
栈和队列
栈的定义栈是一种重要的线性结构,是线性表的一种具体形式。栈是先进后出,后进先出的线性表,它要求只在表尾进行删除和插入操作。比如浏览器,每点一次后退,就回到上次浏览过的界面,这就是栈的一个应用案例。栈的插入操作(Push),叫做进栈,也称为压栈,入栈。栈的删除操作(Pop),叫做出栈,也称为弹栈。栈分为顺序存储结构和栈的链式存储结构。但一般用的最多的就是顺序存储结构。如何判断栈为空呢?一...原创 2018-09-30 09:48:14 · 242 阅读 · 0 评论 -
递归定义以及斐波那契数列的实现
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1F(2)=1F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)...原创 2018-09-30 11:08:23 · 1398 阅读 · 0 评论 -
字符串
字符串介绍字符串比较大小跟传统的数字比较有点差别,很容易我们可以知道2比1大,可是字符串怎么比较呢?其实就是比较字符串里每个字符的ASCII码大小,但是单纯比较字符串大小没有太大意义。字符串的存储结构与线性表相同,也分顺序存储结构和链式存储结构。字符串的顺序存储结构是一组连续的存储单元来存储串中的字符序列的。按照预定义的大小,为每个定义的字符串变量分配一个固定长度的存储区,一般用定长数组来定义...原创 2018-09-30 19:37:36 · 338 阅读 · 0 评论 -
C++中vector的访问和赋值
#include <iostream>#include<cmath>#include<algorithm>#include<vector>using namespace std;int main(){ // 1. initialize vector<int> v0; vector<int>...原创 2018-11-28 18:48:06 · 2421 阅读 · 0 评论 -
常用的几种排序算法C++实现(冒泡排序,插入排序,选择排序)
源代码:#include <iostream>#include<vector>#include<algorithm>using namespace std;//冒泡排序,时间复杂度比较高,O(n^2)vector<int> bubbleSort(vector<int>& nums) { for (int i =...原创 2018-12-10 14:30:52 · 643 阅读 · 0 评论 -
哈希表中处理冲突的方法
为什么会有冲突?当关键字集合很大时,关键字值不同的元素可能会映像到哈希表的同一地址上,即K1!=K2,但f(K1)=f(K2),这种现象称为hash冲突,实际中冲突是不可避免的,只能通过改进哈希函数的性能来减少冲突。解决哈希冲突的几种办法处理冲突是指对于一个待插入哈希表的数据元素,若按给定的哈希函数求得的哈希地址已被占用,则按一定规则求下一哈希地址,如此重复,直至找到一个可用的地址以保存该元...原创 2019-01-21 22:03:33 · 865 阅读 · 0 评论 -
C++实现希尔排序
介绍希尔排序是一个快速的,且不稳定的排序,基本思想是比较两个相隔jmp大小的元素,具体算法不再多述,具体请见希尔排序算法。源代码#include<iostream>#include <vector>using namespace std;void shell_sort(vector<int>& point){ int temp, jm...原创 2019-07-12 14:30:54 · 268 阅读 · 0 评论