Storm-Shadow
愿君出走半生,归来时仍是少年
展开
-
众数问题
众数问题 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。 多重集S的众数是2,其重数为3。 对于给定的由n个自然数组成的多重集S,编程计算S的众数及其重数。方法一:采用分治算法的思想– 先由找一个基准元素X,把整数数组基于X进行划分– 统计X出现的次数T– 如原创 2013-10-03 21:50:55 · 1794 阅读 · 0 评论 -
05_ 输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历
今天忽然看到一大神写的建立二叉树的程序,感觉他的编程技巧很高超,代码简洁干练,忍不住转一把。(我也要努力,争取早日达到这种水平)原文链接:http://blog.youkuaiyun.com/hackbuteer1/article/details/72753961. 题目描述: 输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。输入: 输入第一行包括一个整数n(1转载 2013-09-26 17:10:16 · 5699 阅读 · 0 评论 -
04_N阶楼梯上楼问题、输入一个ip地址串,判断是否合法、输入一个四行五列的矩阵,找出每列最大的两个数
1. 题目描述:N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式。(要求采用非递归)输入:输入包括一个整数N,(1输出:可能有多组测试数据,对于每组数据,输出当楼梯阶数是N时的上楼方式个数。样例输入:4样例输出:5 分析:假设 f(n) 为上 n 阶楼梯的方法数量。则如果只有 1 阶楼梯,显然只有一种方法走完;如果有 2 阶楼梯,显然原创 2013-09-26 16:45:40 · 2723 阅读 · 0 评论 -
03_统计单词个数、求阶乘、输出最短和最长的字符串
1. 题目描述:编一个程序,读入用户输入的,以“.”结尾的一行文字,统计一共有多少个单词,并分别输出每个单词含有多少个字符。(凡是以一个或多个空格隔开的部分就为一个单词)输入:输入包括1行字符串,以“.”结束,字符串中包含多个单词,单词之间以一个或多个空格隔开。输出:可能有多组测试数据,对于每组数据,输出字符串中每个单词包含的字母的个数。样例输入:hello h原创 2013-09-24 21:33:17 · 1995 阅读 · 0 评论 -
02_对N个长度最长可达到1000的数进行排序、对给定的一个字符串,找出有重复的字符,并给出其位置、输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序
1.题目描述:对N个长度最长可达到1000的数进行排序。输入:输入第一行为一个整数N,(1接下来的N行每行有一个数,数的长度范围为1每个数都是一个正数,并且保证不包含前缀零。输出:可能有多组测试数据,对于每组数据,将给出的N个数从小到大进行排序,输出排序后的结果,每个数占一行。样例输入:3111111111111111111111111111112222原创 2013-09-24 11:43:30 · 4205 阅读 · 0 评论 -
01_进制转换、结构体排序、字符奇校验、字符串连接、实现一个加法器,使其能够输出a+b的值
1. 题目描述:输入一个整数,将其转换成八进制数输出。输入:输入包括一个整数N(0输出:可能有多组测试数据,对于每组数据,输出N的八进制表示数。样例输入:789样例输出:71011参考答案#includeint convert(int arr[], int t){ int k = 0, p = t; if(原创 2013-09-21 11:55:59 · 1561 阅读 · 0 评论 -
贪心算法分析
动态规划是对分治算法的一种改善,当它发现分解出来的子问题有重叠时,保用自底向上的策略来避免重复计算,从而提高了算法的效率。其特点是在每次做出选择前,将所有选择的效果都进行计算,在此计算的基础上选出最优的选项,所以动态规划的每次选择都是最优的。但是,当可选项的数目巨大时,算法将不堪重负,所以在这种条件下,有必要采用新的算法。 贪心算法的基本策略:一步一步地构建问题的最优解,其中每一步均只考虑眼原创 2013-12-15 21:18:38 · 2177 阅读 · 0 评论 -
动态规划算法例题及解析
在此再次简要描述一下动态规划算法的基本要素:(1) 最优子结构性质:这是可用动态规划算法求解的前提条件(2) 重叠子问题:子问题是否具有重叠性会影响到动态规划算法的效率 1.字符串转换设A和AB是两个字符串,要用最少的字符操作,将字符串A转换为字符串B,这里的操作限定为:(1)删除一个字符;(2)插入一个字符;(3)将一个字符变成另一原创 2013-12-15 21:05:46 · 6577 阅读 · 0 评论 -
分治与递归分析
递归与分治分析适合用递归算法来解决的常见问题有:(1)二分搜索技术; (2)大整数乘法;(3)Strassen矩阵乘法;(4)棋盘覆盖;(5)合并排序和快速排序;(6)线性时间选择;(7)最接近点对问题;(8)循环赛日程表。 算法总体思想 对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,原创 2013-10-01 12:56:30 · 2734 阅读 · 1 评论 -
算法之大整数乘法
大数的表示方法有很多种,最易懂的而且最跟手工计算方式最接近的方式是通过字符数组来保存大数,数组的每个元素保存大数的一个十进制数字,这种方式操作比较简单,但是这种方式需要较多的额外运算,所以效率低下。另一种方式是采用链表作为存储结构,这种方式可以适应不同长度的大数,但是这种方式的存储效率很低,对本身就需要不少内存空间的大数运算来说负担很重,而且频繁的堆操作和解引用操作会大量增加开销,此外链表存储的不原创 2013-09-04 12:56:34 · 2307 阅读 · 0 评论 -
求阶乘与多整数连乘问题
1. 求阶乘问题对给定的 n(n 分析:因为要求的整数可能大大超出一般的整数的位数,所以应使用一维数组存储长整数,数组中的每个元素只存储长整数的一位数字。如有 m 位长整数 num,则用数组 arr[]存储如下:num = arr[m]*10^(m-1) + arr[m-1]*10^(m-2) + ... + arr[2]*10^1 + arr[1]*10^0并用arr[0]存原创 2013-09-01 21:20:43 · 3127 阅读 · 0 评论 -
算法复习之动态规划_03
动态规划(dynamic programming) 动态规划是求解决策过程(decision process)最优化的一种数学方法。动态规划主要用于求解以时间划分阶段的动态过程的优化问题,一些与时间无关的静态规划,只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。基本模型 多阶段决策过程的最优化问题: 在现实生活中,有一类活动的过程,可将过程原创 2013-08-29 17:01:19 · 1609 阅读 · 0 评论 -
算法复习之递归算法_02
递归算法 一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称为递归函数。递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。(说明:递归算法往往效率低下,所以能不使用时就尽量不要用,以下所以递归程序只是为了说明问题,以便于理解递归的原理。对于这些问题,其实可以使用更高效的方法来解决的)递归算法的特点(1) 递归就是在过程或函数里调原创 2013-08-29 00:17:51 · 1321 阅读 · 0 评论 -
算法复习之分治算法_01
算法分析之分治算法一、基本概念及策略 分治法即分而治之,就是把一个复杂的问题分成两个或更多的相似的子问题,再把子问题分成更小的问题...直到最后子问题可以直接求解,原问题的解即子问题的解的合并。排序算法(快速排序、归并排序)等都含有分治的思想。 如果原问题可分割成k个子问题,1二、分治法适用的情况分治法所能解决的问题一般具有以下几个特征:1、该问题的规模缩小原创 2013-08-26 22:21:38 · 1800 阅读 · 0 评论 -
字符串的模式匹配 KMP(Knuth-Morris-Pratt) 算法
本章讨论的是基于KMP算法(KMP即Knuth-Morris-Pratt)的串的模式匹配问题,什么是模式匹配,请参考前一章“字符串的模式匹配”。查找算法实例让我们用一个实例来演示这个算法。在任意给定时间,本算法被两个整数m和i所决定:m代表主文字符串S内匹配字符串W的当前查找位置, i代表匹配字符串W当前做比较的字符位置。图示如下:...原创 2021-06-02 12:41:09 · 252 阅读 · 0 评论 -
Pattern Searching(字符串的模式匹配)
字符串的模式匹配是计算机中应用非常广泛的一个问题,在浏览器、数据库等查询中,都需要用到模式匹配。问题描述:给定两个字符串txt[0..n-1]和pat[0..m-1],试查找txt中pat子串所在的所有位置,假设n>m。例如:...原创 2021-06-02 12:32:59 · 358 阅读 · 0 评论 -
Knapsack Problem(0-1背包问题)
0-1背包问题,是说给定 n 个物体,每个物体都有一定的重量和价值,再给一个能容纳最大重量为 w 的背包。求从 n 个物体中选出若干个放到背包中,在所选物体总重量不超过 w 的情况下,所选物体的总价值最大。注意:所有物体都不可分割。分析:这个问题可抽象为给定两个数组 wt[0..n-1] 和 val[0..n-1],第一个数组表示各物体的重量,第二个数组表示各物体的价值。从 wt 数组中选出若干个元素,它们的总重复不超过 w,而且总价值最大。这是动态规划里的一个经典问题1.最优子结构性质原创 2021-06-02 11:53:25 · 507 阅读 · 0 评论 -
Binomial Coefficient(二项式系数)的计算
二项式系数 C(n, k),或组合数,是定义为形如 (1+x) 的二项式 n 次幂展开后 x 的系数(其中 n 为自然数,k 为整数)。C(n, k) 给出了从 n 个物体中随机选出 k 个物体的所有可选组合的数量。例如 C(4, 2) 表示从 4 个物体中随机选出 2 个,一共有 6 种选法,所以 C(4, 2)=6;类似的,C(5, 2)=10。由二项式的性质有下面的两个公式C(n, k) = C(n-1, k-1) + C(n-1, k)C(n, 0) = C(n, n) = 1现要求原创 2021-06-02 11:48:26 · 2988 阅读 · 0 评论 -
Java面试常见的45道算法题及实现代码汇总
前面两个类,是所有这些算法题可能用到的公共基础类(即BinaryTreeNode类和Node类)BinaryTreeNodepublic class BinaryTreeNode { private int data; private BinaryTreeNode LchildNode; private BinaryTreeNode RchildNode; public BinaryTreeNode(int data) { super();原创 2020-12-08 16:57:53 · 594 阅读 · 0 评论 -
最大连续乘积子串(动态规划问题)
题目描述给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8。也就是说,上述数组中,3 0.5 8这3个数的乘积30.58=12是最大的,而且是连续的。分析与解法此最大乘积连续子串与最大乘积子序列不同,请勿混淆,前者子串要求连续,后者子序列不要求连续。也就是说,最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence,LCS)是:子串(Subs原创 2020-12-08 16:07:32 · 375 阅读 · 0 评论 -
从n个整数中寻找和为指定值的多个数,0-1背包问题
题目描述输入两个整数n和sum,从数列1,2,3.......n 中随意取几个数,使其和等于sum,要求将其中所有的可能组合列出来。分析与解法解法一注意到取n,和不取n个区别即可,考虑是否取第n个数的策略,可以转化为一个只和前n-1个数相关的问题。如果取第n个数,那么问题就转化为“取前n-1个数使得它们的和为sum-n”,对应的代码语句就是sumOfkNumber(sum - n, n - 1); 如果不取第n个数,那么问题就转化为“取前n-1个数使得他们的和为sum”,对应的代码语句原创 2020-12-08 16:03:16 · 951 阅读 · 0 评论 -
如何最快的从n个整数中找到最小的k个数
题目描述输入n个整数,输出其中最小的k个。分析与解法解法一要求一个序列中最小的k个数,按照惯有的思维方式,则是先对这个序列从小到大排序,然后输出前面的最小的k个数。至于选取什么的排序方法,我想你可能会第一时间想到快速排序(我们知道,快速排序平均所费时间为n*logn),然后再遍历序列中前k个元素输出即可。因此,总的时间复杂度:O(n * log n)+O(k)=O(n * log n)。解法二咱们再进一步想想,题目没有要求最小的k个数有序,也没要求最后n-k个数有序。既然如此,就原创 2020-12-08 15:58:59 · 1323 阅读 · 0 评论 -
图解B+树的插入过程
B+ 树在现代数据库中很常见,如果我们了解它,在工作中可能对性能优化会有更好的帮助!最近我一直在思考 B+ 树的高度是由什么决定的。知道我了解了 B+ 树的插入过程,才有一种恍然大悟的感觉!网上的一些资料杂乱无章,不同的数据库可能还有对 B+ 树有不同的实现。但是万变不离其宗,B+ 树的定义,大致如下所示:总结一下,B+ 树有下面 5 个重要的特点。B+ 树包含 2 种类型的结点: 内部结点(也称索引结点)和叶子结点。 根结点本身即可以是内部结点,也可以是叶子结点。 根结点的关键字个数最原创 2020-11-29 14:03:43 · 2007 阅读 · 0 评论 -
一文搞懂hash表算法,Hash算法的C语言示例代码
第一部分:Top K 算法详解问题描述百度面试题:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。必备知识什么是哈希表?哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访原创 2020-11-29 13:46:06 · 828 阅读 · 0 评论 -
如何在40亿个乱序的数中快速查找某个数值是否存在
题目描述给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?分析与解法海量数据处理往往会很有趣,有趣在什么地方呢?空间,available的内存不够,需要反复交换内存 时间,速度太慢不行,毕竟那是海量数据 处理,数据是一次调用还是反复调用,因为针对时间和空间,通常来说,多次调用的话,势必会增加预处理以减少每次调用的时候的时间代价。解法一咱们回到眼前要解决的这个问题,1个unsigned int占用4字节,40亿大约原创 2020-11-29 13:34:55 · 1958 阅读 · 0 评论 -
最短路径算法,即Dijkstra分析及C语言实现
指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”,即Dijkstra算法。单源什么意思?从一个顶点出发,Dijkstra算法只能求一个顶点到其他点的最短距离而不能任意两点。Dijkstra算法的标记和结构与prim算法的用法十分相似,它们两者都会从余下顶点的优先队列中选择下一个顶点来构造一颗扩展树。但千万不要把它们混淆了,它们解决的是不同的问题。因此,所操作的优先级也是以不同的方式计算的:Dijkstra算法比较路径的长度,因此必须把边的权重相加,而prim算法则直接比较给定的权原创 2020-11-27 16:23:13 · 914 阅读 · 0 评论 -
程序需要知道的11个常见的二叉树相关算法题
1.1 重建二叉树已知前序遍历为{1,2,4,7,3,5,6,8},中序遍历为{4,7,2,1,5,3,8,6},它的二叉树是怎么样的?1、思路根据前、中序遍历的特点,(根左右、左根右),先根据前序遍历确定根节点,然后在中序遍历知道该根节点的左右树的数量,反推出前序遍历中左子树的结点有哪些。根据该思路进行递归即可完成二叉树的重建。2、 测试用例完全二叉树、非完全二叉树 —— 普通测试。只有左子节点二叉树,只有右子节点、只有一个结点的二叉树 —— 特殊二叉树测试。空树、前序和中序不匹配 —原创 2020-11-24 11:55:54 · 361 阅读 · 0 评论 -
二叉树迭代器(中序递归、前序和后序遍历)算法
二叉树(Binary Tree)的前序、中序和后续遍历是算法和数据结构中的基本问题,基于递归的二叉树遍历算法更是递归的经典应用。假设二叉树结点定义如下:struct Node { int value; Node *left; Node *right;}中序递归遍历算法:void inorder_traverse(Node *node) { if (NULL != node->left) { inorder_traverse(node原创 2020-11-23 22:36:43 · 815 阅读 · 0 评论 -
并查集算法(UNION-FIND)详细解析
主要内容并查集是一种树形的数据结构,通过这种数据结构能够有效处理不相交集合间的合并(union)及查询(find)问题。比如动态连通性问题。这种数据结构主要涉及两个操作:Find:查询元素属于哪一个子集。此操作还可以用来确定两个元素是否属于同一子集。Union:将两个子集合并成到一个集合中。1. 动态连通性问题(dynamic connectivity)动态连通性的应用很广泛:比如网络诊断:网络中的两台计算机是否连通,社交网络中的两个人是否存在交集,芯片中的电路元件连通性等等。场景.原创 2020-11-23 20:58:34 · 686 阅读 · 0 评论 -
动态规划算法的解题四步法模板,学会之后套用即可解决大多数算法题
动态规划问题一直是算法面试当中的重点和难点,并且动态规划这种通过空间换取时间的算法思想在实际的工作中也会被频繁用到,这篇文章的目的主要是解释清楚什么是动态规划,还有就是面对一道动态规划问题,一般的思考步骤以及其中的注意事项等等,最后通过几道题目将理论和实践结合。什么是动态规划如果你还没有听说过动态规划,或者仅仅只有耳闻,或许你可以看看 Quora 上面的这个回答。How to explain dynamic用一句话解释动态规划就是 “记住你之前做过的事”,如果更准确些,其实...原创 2020-11-22 12:59:08 · 429 阅读 · 0 评论 -
几道和「滑动窗口」有关的算法面试题
前言科普:什么是滑动窗口算法滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合。假设有数组 [a b c d e f g h ],一个大小为 3 的滑动窗口在其上滑动,则有:[abc][bcd][cde][def][efg][fgh]一般情况下就是使用这个窗口在数组的合法区间内进行滑动,同时动态地记录一些有用的数据,很多情况下,能够极大地提高算法地...原创 2020-11-22 12:50:25 · 358 阅读 · 0 评论 -
高频面试题:B树是什么?为什么文件索引要用B树而不用二叉查找树?
一、面试被怼面试官:你知道文件索引、数据库索引一般用什么数据结构来存储吗?小秋:知道啊,一般都是用树形结构来存储的。面试官:可以说说为啥用树形结构来存储吗?小秋:树形结构例如想 B 树,B+ 树,二叉查找树都是有序的,所以查询效率很高,可以再 O(logn) 的时间复杂度查找到目标数据。面试官:那可以问问文件索引,例如数据库索引一般用哪种树形结构吗?小秋:大部分用 B+ 树,少部分用 B 树。(B和B+树太他么复杂了,幸好背了下面试题,嘻嘻)面试官:想问下为什么要用 B 树而不用原创 2020-11-21 22:22:36 · 257 阅读 · 0 评论 -
动态规划的原理与算法实例
听到动态规划这个响亮的大名你可能已经望而却步,那是因为这个响亮的名字真的真的很具有迷惑性,不像递归、回溯和贪心等等算法一样,其文即其意,而动态规划则不同,很容易望文生义,真可谓害人不浅,今天我就带大家一起扒一扒动态规划的裤子。第一点,大家在学习动态规划时切忌望文生义,因为其名字与其思想八竿子打不着。你可以自己起一个能让自己记住其思想的名字更好,比如递推公式法,状态转移方程法等等。第二点,与其说动态规划是一个算法,还不如说是解决问题的方法论。第三点,动态规划的一般形式就是求最优值,比如最长...原创 2020-11-21 21:22:04 · 898 阅读 · 0 评论 -
在接近有序的数组中查找指定元素
给定一个排好序的整型数组,将数组中的个别相邻的两个元素互换,如元素arr[i]只能和arr[i-1]或arr[i+1]互换,现要求在打乱顺序后的数组中查找指定元素。例如Input: arr[] = {10, 3, 40, 20, 50, 80, 70}, key = 40Output: 2 Output is index of 40 in given arrayInput: arr[] = {10, 3, 40, 20, 50, 80, 70}, key = 90Output:原创 2020-09-15 14:11:22 · 345 阅读 · 0 评论 -
字符串的模式匹配 KMP Algorithm
本章讨论的是基于KMP算法(KMP即Knuth-Morris-Pratt)的串的模式匹配问题,什么是模式匹配,请参考前一章字符串的模式匹配 Pattern Searching。查找算法实例让我们用一个实例来演示这个算法。在任意给定时间,本算法被两个整数m和i所决定:m代表主文字符串S内匹配字符串W的当前查找位置, i代表匹配字符串W当前做比较的字符位置。图示如下:我们从W与S的开头比较起。我们比对到S[3](=' ')时,发现W[3](='D')与其不符。接着并不是从..原创 2020-09-15 14:07:10 · 200 阅读 · 0 评论 -
字符串的模式匹配 Pattern Searching
字符串的模式匹配是计算机中应用非常广泛的一个问题,在浏览器、数据库等查询中,都需要用到模式匹配。问题描述:给定两个字符串txt[0..n-1]和pat[0..m-1],试查找txt中pat子串所在的所有位置,假设n>m。例如:Input: txt[] = "THIS IS A TEST TEXT" pat[] = "TEST"Output: Pattern found at index 10Input: txt[] = "AABAACAADAABAABA"原创 2020-09-15 13:56:25 · 343 阅读 · 0 评论 -
把二叉树转化成BST
给定一棵二叉树,请把它转化成 Binary Search Tree(BST),且不能改变原二叉树的形状。如下是两个转化示例解:我们可以通过三大步骤完成转化(1)创建一个辅助数组 arr[],然后中序遍历原二叉树,把各节点存放到 arr[] 中,这一步时间复杂度为 O(n);(2)对 arr[] 进行升序排序,这一步的时间复杂度和具体的排序算法有关,快速排序是 O(n^2),堆排序或归并排序是 O(nLogn);(3)再次中序遍历原二叉树,在遍历的过程中,把数组 arr[] 中的元素依原创 2020-08-10 16:38:23 · 241 阅读 · 0 评论 -
在BST中删除指定范围之外的节点
给定一棵 Binary Search Tree(BST)和一个范围 [min, max],请把 BST 上所有在 [min, max] 范围之外的节点都删除掉,且保持删除节点后的新树仍是 BST。如下是一棵 BST,给定范围为 [-10, 13]在删除掉所有在 [-10, 13] 范围之外的节点后,得到的新 BST 如下解:对 BST 上的每个节点,有两种情况(1)节点在给定范围外,这种情况还可再细分两种情况(a)节点小于 min;(b)节点大于 max;(2)节点在给.原创 2020-08-10 15:50:01 · 340 阅读 · 0 评论 -
在BST中查找节点最多的子BST
给定一棵二叉树,试设计算法在这棵二叉树中寻找节点最多的 BST(Binary Search Tree),如果整棵二叉树本身就是一棵 BST,那么返回整棵树的节点数量。如下是几个例子解法一:可以从根节点开始遍历整棵二叉树,对每个节点,检查以它为根的子树是否是 BST,如果是,那么返回其节点数量,否则递归遍历其左、右子树并返回其左、右子树中节点最多的 BST。这种算法复杂度为 O(n^2),关键算法如下/* max() returns maximum of two integers原创 2020-08-10 15:45:35 · 300 阅读 · 0 评论 -
求BST中第K个最小的元素
给定一棵 BST,请在这棵 BST 上查找其对应的升序序列中的第 k 个元素(即第 k 小元素)。如下图的 BST,如果 k=3,那么所求节点为 10,如果 k=5,那么所求节点为 14。解法一:中序遍历法,我们用一个栈作为辅助进行中序遍历,在遍历过程中,对出栈次数进行计数,出栈 k 次时即找到我们要的节点。算法复杂度为 O(n),n 为树的节点总数,算法描述如下:/* initialization */pCrawl = rootset initial stack element原创 2020-07-16 13:47:43 · 508 阅读 · 0 评论