
算法和数据结构
文章平均质量分 70
Real_JumpChen
这个作者很懒,什么都没留下…
展开
-
Strassen’s 矩阵乘法—分治法实现
内容会持续更新,有错误的地方欢迎指正,谢谢!前言:博主最近正在学习《算法》这门专业课程,这是该课程的第二次上机题目,我把自己的解题方法分享给大家,欢迎讨论!题目: 1.比较数学定义的矩阵乘法算法和Strassen’s 矩阵乘法算法的效率; 2.自主生成两个16*16的矩阵,输出Strassen’s 矩阵乘法算法结果。数学定义的矩阵乘法算法:利用三个for循环来解决,时间复杂度为O(n^3)。数学原创 2017-12-06 23:40:46 · 5849 阅读 · 0 评论 -
数组相关题目汇总
内容会持续更新,有错误的地方欢迎指正,谢谢!前言数据结构有这几类:数组、字符串、链表、树、栈、队列。 其中,数组和字符串都是用的连续内存,数组中装数字,字符串中装字符,这两个都是面试中出现频率最高的数据结构;链表和树需要大量指针,特别考察代码的鲁棒性;栈与递归紧密相关,队列与BFS紧密相关。数组的时间效率高,空间效率低。为了解决数组空间效率低的问题,人们又实现了多种动态数组,比如...原创 2018-01-31 23:48:52 · 1363 阅读 · 0 评论 -
字符串相关题目汇总
内容会持续更新,有错误的地方欢迎指正,谢谢!前言字符串在编程时的使用频率非常高。字符串在C/C++和C#中的特性如下:在C/C++中每个字符串都以’\0’结尾,比如”12345”占用6个字节。在C#中,String的内容是不能被改变的,一旦进行改变操作,便会产生一个新的实例并返回,所以,对String进行连续多次修改,每次都会产生一个临时对象,开销挺大的。令String text="hello"原创 2018-01-31 23:47:08 · 690 阅读 · 0 评论 -
数据结构和算法概念题
内容会持续更新,有错误的地方欢迎指正,谢谢!数据结构1、数组和链表的区别很简单,但是很常考,记得要回答全面:从逻辑结构来看:数组的大小一旦定义就不能改变,当数据增加时,可能溢出;当数据减少时,会造成内存浪费,当然,一开始将把数组定义大一些,也会造成内存浪费;而链表是动态分配内存的,可方便地插入、删除数据项。这方面堆优秀。从内存存储来看:数组从栈中分配空间(用NEW创建的在堆中), 可方便快捷地使用,原创 2018-01-31 15:27:17 · 951 阅读 · 0 评论 -
单链表和二叉树解题思路汇总
内容会持续更新,有错误的地方欢迎指正,谢谢!常识1.如何分析一个问题?画图+举例=>算法,还要分析时间复杂度以判断是否可行。 2.写完代码后,如何编写测试用例?也就是两类测试用例:功能测试和边界测试! 3.如何能及时发现并纠正代码的问题?提前想好测试用例,写完代码后,立即用事先准备好的测试用例进行检查。只有确保代码通过测试后,再提交给Interviewer。因为他也是通过他事...原创 2018-01-31 13:45:03 · 820 阅读 · 0 评论 -
单链表题目汇总
内容会持续更新,有错误的地方欢迎指正,谢谢!本文默认已定义了以下结点结构: struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }//尽量使用初始化列表,因为它调用的是赋值构造函数,可少调用一次默原创 2018-01-28 08:58:06 · 874 阅读 · 0 评论 -
红黑树,你还要我怎样
关于红黑树的相关重点,原博主总结得非常好,我只做了细微的修改!【转载】http://blog.youkuaiyun.com/silangquan/article/details/18322087红黑树很重要,STL中的set、map、multimap、multiset这些关联容器都是红黑树实现的,但能红黑树的实现难度非常大,所以,我们记住如下的重点就好。关于红黑树的基本概念,请见http://blog.csdn转载 2018-01-07 18:45:56 · 576 阅读 · 0 评论 -
数据结构中常见的树 BST AVL RBT B- B+ B*
内容会持续更新,有错误的地方欢迎指正,谢谢!二叉搜索树BST又名二叉查找树、二叉排序树、B树。BST需满足如下要求:1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字,且关键字互不相等; 3.根节点的值大于左子树所有节点的值,并小于右子树所有节点的值; 4.左右子树仍然为BST;另外,因为一棵由n个结点随机构造的二叉查找树的高原创 2018-01-06 01:36:33 · 873 阅读 · 0 评论 -
Bitmap和2-Bitmap海量数据处理问题
内容会持续更新,有错误的地方欢迎指正,谢谢!题目题1:在2.5亿个整数找出不重复的整数,内存不足以容纳着2.5亿个整数。 题2:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中? 题3:“游戏任务标记”的编程题,请见链接: http://blog.youkuaiyun.com/billcyj/article/details/789484原创 2018-01-02 09:41:01 · 5174 阅读 · 1 评论 -
堆排序之堆的概念—插入、删除、建堆
内容会持续更新,有错误的地方欢迎指正,谢谢!堆的性质性质:完全二叉树 或 近似完全二叉树(不是满二叉树的完全二叉树)。分类:最大堆:父节点的值不小于子节点;最小堆:父节点的值不大于子节点。 左右子节点:没有大小的顺序。堆的存储: 一般都用数组来存储堆。下标为i的节点的父节点的下标为(i–1)/2。根节点的左右子节点下标分别为 2∗i+1 和 2∗i+2。例如:下标为0的节点左右子节点的下标原创 2017-11-08 19:57:49 · 7048 阅读 · 0 评论 -
深入理解递归(二)
【转载】递归(2):高级一、递归的方式递归的方式分为两个:自底向上和自顶向下。我们以打印单链表为例:/* 自底向上 */ void Print(Node * node) { if (node == nullptr) return; Print(node->next); cout << node->data << " "; }/* 自顶向下 */转载 2018-02-03 23:37:57 · 1119 阅读 · 0 评论 -
二进制的算法题怎么做
内容会持续更新,有错误的地方欢迎指正,谢谢!告诉大家一个诀窍,能高效解决大多数二进制的题目。假设有一个数n,那么n&(n-1)的作用: n&(n-1)得到的结果相当于把整数的二进制表示中最右边的那个1变成0。例子:求二进制数中1的个数。输入一个整数,输出该数二进制表示中1的个数,其中负数是用的补码表示。class Solution{public: int NumberOf1(int n)原创 2018-03-19 12:15:30 · 3468 阅读 · 0 评论 -
哈希表及处理冲突的常用方法
内容会持续更新,有错误的地方欢迎指正,谢谢!前言哈希法又称散列法,相应的表称为哈希表或散列表。 基本思想:先在元素的关键字k和元素的存储位置p之间建立一个对应关系H,使得p=H(k),H称为哈希函数。创建哈希表时,把关键字为k的元素直接存入地址为H(k)的单元;以后当查找关键字为k的元素时,再利用哈希函数计算出该元素的存储位置p=H(k),从而达到按关键字直接存取元素的目的。...原创 2018-04-04 18:18:49 · 5070 阅读 · 0 评论 -
二分查找有个坑
内容会持续更新,有错误的地方欢迎指正,谢谢!例题: 在序列 [22, 34, 55, 77, 89, 93, 99, 102, 120, 140] 中,采用二分查找,分别查找77,34,99,所需的查找次数分别为()答案: 4,2,4理由: 假设低下标用low表示,高下标用high表示 查找77: 开始low = 0, high = 9 第一次查找,找到中心的下标为(0+9...原创 2018-04-05 00:28:18 · 855 阅读 · 0 评论 -
算法时间复杂度分析
内容会持续更新,有错误的地方欢迎指正,谢谢!符号的辨析Ο,读音:big-oh;表示上界,小于等于。 ο,读音:small-oh;表示上界,小于。 Ω,读音:big omega、欧米伽;表示下界,大于等于。 ω,读音:small omega;表示下界,大于。 Θ,读音:theta、西塔;既是上界也是下界,称为确界,等于。Ο是渐进上界,Ω是渐进下界。Θ需同时满足大Ο和Ω,故称为确界。Ο极其有用,原创 2018-02-03 11:15:44 · 1073 阅读 · 0 评论 -
TOP-K问题
内容会持续更新,有错误的地方欢迎指正,谢谢!在一堆数中求其第 k 大或第 k 小的问题,简称 TOP-K 问题。目前解决 TOP-K 问题最有效的算法即是 “BFPRT 算法”,最坏时间复杂度为 O(n)。在首次接触 TOP-K 问题时,我们的第一反应就是可以先对所有数据进行一次排序,然后取其前 k 即可,但是这么做有两个问题:快速排序的平均复杂度为 O(nlogn),但最坏时间复杂度为 O(n2原创 2018-02-03 17:16:03 · 974 阅读 · 0 评论 -
KMP 算法
内容会持续更新,有错误的地方欢迎指正,谢谢!举例:有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含目标字符串”ABCDABD”?别忘了,空格也是字符。Knuth-Morris-Pratt算法(KMP)是最常用的解决该类问题的算法。蛮力字符串匹配看到这题,我们的第一个想法是蛮力匹配:先定义两个下标变量i和j分别表示原字符串和目标字符串的首字符下标;若两个下标变原创 2018-02-03 17:38:32 · 437 阅读 · 0 评论 -
跳台阶问题、变态跳台阶问题、矩形覆盖问题—C++实现
内容会持续更新,有错误的地方欢迎指正,谢谢!本文的例题:递归和循环类型跳台阶问题题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。递归法实现代码://f(n)=f(n-1)+f(n-2) 斐波拉契数列class Solution {public: int konwn[] int jumpFloor(int number)原创 2017-12-14 08:47:00 · 1156 阅读 · 0 评论 -
最近点对算法—分治法实现
内容会持续更新,有错误的地方欢迎指正,谢谢!前言:博主最近正在学习《算法》这门专业课程,这是该课程的第二次上机题目,我把自己的解题方法分享给大家,欢迎讨论!题目: 创建100个随机点,并计算最近的两个点之间的距离,输出随机生成的100个点的坐标、最近的两个点的坐标及其之间的距离、并用#include 画出整个界面并连接最近的两个点。非分治法实现的代码:#include #原创 2017-12-13 21:21:17 · 2653 阅读 · 0 评论 -
深度剖析八大经典排序算法—C++实现(通俗易懂版)
内容会持续更新,有错误的地方欢迎指正,谢谢!引言需握各种排序和常用的数据结构的核心思想,并知道是以什么样的方式解决了什么样的问题。该博客的示例代码均以递增排序为目的~ 学习建议:切忌看示例代码去理解算法,而是理解算法原理写出代码,否则会很快就会忘记。//排序原始数组:int a[10]= { 7,5,3,4,4,1,9,45,121,3 };算法分类八大经典排序...原创 2017-11-06 19:45:03 · 2727 阅读 · 0 评论 -
深入理解递归(一)
内容会持续更新,有错误的地方欢迎指正,谢谢!什么是迭代和递归迭代的是人,递归的是神。 –L. Peter Deutsch简单的定义: 当函数直接或者间接调用自己时,则发生了递归。但递归并不直观, 也不符合我们的思维习惯。因为递归的过程就是出入栈的过程。所以,每个递归程序都可把它改写为非递归版本,只需利用栈,通过入栈和出栈两个操作就可以模拟递归的过程,比如:二叉树的遍历。...原创 2017-12-09 21:01:23 · 1643 阅读 · 0 评论 -
DFS和BFS算法
DFS和BFS异同比较本质区别BFS 的重点在于队列,而 DFS 的重点在于递归。这是它们的本质区别。DFS 算法 是一种利用递归(实质上是用栈来保存未访问的结点,先进后出)实现的搜索算法,直到找到解或走不下去为止。简单来说,其搜索过程和 “不撞南墙不回头” 、“树的先序遍历”类似。BFS算法 是一种利用队列(用队列来保存未访问的结点,先进先出)实现的搜索算法。简单来说...转载 2018-01-05 01:10:19 · 6047 阅读 · 0 评论 -
最长共同子序列LCS—动态规划实现
内容会持续更新,有错误的地方欢迎指正,谢谢!前言:博主最近正在学习《算法》这门专业课程,这是该课程的第三次上机题目,我把自己的解题方法分享给大家,欢迎讨论!题目: 描述并实现最长共同子序列动态规划算法,并显示S1=ACCGGTCGAGATGCAG,S2 = GTCGTTCGGAATGCAT 的最长共同子序列。最终结果: 最长共同子序列:CCGGGAATGCA 长度:11该题...原创 2017-12-13 23:42:11 · 1354 阅读 · 0 评论 -
作业排程算法—动态规划实现
内容会持续更新,有错误的地方欢迎指正,谢谢!前言:博主最近正在学习《算法》这门专业课程,这是该课程的第三次上机题目,我把自己的解题方法分享给大家,欢迎讨论!题目: 最终结果: 该题的递推式: 根据该递推式,便可写出基于递归的动态规划代码,此处省略该代码。我们用基于迭代的动态规划代码试试:基于迭代的动态规划代码void FastestWay( int&amp; r...原创 2017-12-13 22:50:18 · 9173 阅读 · 3 评论 -
递归、分治和动态规划的关系
内容会持续更新,有错误的地方欢迎指正,谢谢!动态规划如果大问题分解为很多小问题后,小问题有互相重叠部分,则用递归的思路来分析问题,再用数组存储中间结果+循环的思路来写代码!动态规划的三个特征适用于最优解问题有大量的重复子问题子问题之间有依赖(不独立)与递归的关系:这些重复的子问题,DP算法将其结果用一维或二维数组(邻接矩阵)保存下来,等下一次又要计算该子问题时,直接...原创 2017-12-10 17:27:16 · 1360 阅读 · 0 评论 -
单源最短路径和全成对最短路径算法
内容会持续更新,有错误的地方欢迎指正,谢谢!前言:博主最近正在学习《算法》这门专业课程,这是该课程的第四次上机题目,我把自己的解题方法分享给大家,欢迎讨论!单源最短路径 题目以 S 为源节点,实现Bellman-Ford(中文名:贝尔曼福特算法) 单源最短路径算法。Dijkstra算法请见下方图解: 但Dijkstra算法不适用于有负权边的图,所以这里,用Be...原创 2017-12-18 14:06:38 · 2354 阅读 · 0 评论 -
二叉树题目汇总
内容会持续更新,有错误的地方欢迎指正,谢谢!前言二叉树虽然简单,但是与链表相比,树中的指针操作更多也更复杂,细微之处更能特别考验程序员的能力,所以,若想加大面试难度,树的题目是不二之选,博主在此列出一些二叉树常见的题型。 思路:先考虑边界测试,再考虑功能测试。 大多数边界条件都只需要判断: if(pRoot==nullptr) return;//或return 0;少数题还原创 2018-01-31 01:42:51 · 2343 阅读 · 2 评论 -
剑指Offer—算法和数据结构
内容会持续更新,有错误的地方欢迎指正,谢谢!递归和迭代递归的代码简洁但性能不如迭代,面试时,可根据题目的特点和面试官的要求选择如何实现。深入理解递归(一) 深入理解递归(二)排序和查找重点掌握 二分查找、归并排序、快速排序旋转数组的最小数字把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1原创 2018-02-27 09:23:26 · 1676 阅读 · 0 评论 -
栈和队列相关题目汇总
内容会持续更新,有错误的地方欢迎指正,谢谢!前言栈:后进先出,常用于存储函数调用时函数的参数、返回地址及临时变量等。 队列:先进先出,常用于BFS,比如:在遍历某一层节点时,把节点的子节点放进一个队列里,以备下一层节点的遍历。 但栈和队列却有互相之间的联系,请见下题。用两个栈实现队列用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。小诀窍:通过具体的例子+画图的原创 2018-02-27 08:46:26 · 622 阅读 · 0 评论 -
0-1背包问题
内容会持续更新,有错误的地方欢迎指正,谢谢!问题有 N 件物品和一个容量为 V 的背包。第 i 件物品的体积是 Ci,其价值是 Wi。求在不超过背包容量V的情况下,将哪些物品装入背包可使价值总和最大。思路很明显的一道考察动态规划的题目。 F(i,V)表示 在前i件商品中选择若干件放入容量为V的背包中,可获得的最大价值。 递推式: 1. 如果i等于0,F(i,V)=0 2. 如果i大于0,F(原创 2018-02-03 21:48:25 · 917 阅读 · 0 评论 -
洗牌算法:随机打乱一个数组
内容会持续更新,有错误的地方欢迎指正,谢谢!把一个数组内元素的顺序随机打乱,重视公平和效率。首先从全部n个元素中随机选取一个与第一个元素交换;然后再在第一个之后的n-1个元素中选择一个元素与第二个交换;直到最后一个元素。这样才能确保每个元素在每次交换时的概率相等。#include <iostream> #include <time.h> #include <algorithm>using原创 2018-04-14 02:16:24 · 1228 阅读 · 0 评论