随笔分类 - 算法
摘要:本文例子完整源码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/sword 《【好书推荐】《剑指Offer》之软技能》 《【好书推荐】《剑指Offer》之硬技能(编程题1~6)》 《【好书推荐】《剑
阅读全文
摘要:本文例子完整源码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/sword 《【好书推荐】《剑指Offer》之软技能》 《【好书推荐】《剑指Offer》之硬技能(编程题1~6)》 持续更新,敬请关注
阅读全文
摘要:本文例子完整源码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/sword 前一篇《【好书推荐】《剑指Offer》之软技能》中提到了面试中的一些软技能,简历的如何写等。《剑指Offer》在后面的章节
阅读全文
摘要:对于矩阵有一类特殊的矩阵,叫做三角矩阵。 这种矩阵如果还是按照定义一个二维数组来对数值进行存储的话,无疑将消耗掉不必要的空间,所以我们采用压缩存储的方式,将矩阵存储在一位数组中。 对于下三角矩阵,如果按照行优先存储,则{a11, a21, a22, a31, a32, a33, a41, a43,
阅读全文
摘要:对于一阶线性方程的求解有多种方式,这里将介绍利用高斯消去法解一阶线性方程组。在介绍高斯消去法前需要对《线性代数》做一下温习,同时在代码中对于矩阵的存储做一个简要介绍。 通常遇到矩阵我们会利用二维数组来进行对矩阵数值的存储(例如前几篇中动态规划中对于求解矩阵初始化就是利用二维数组),但在计算机的内存中
阅读全文
摘要:找零问题:需找零金额为W,硬币面值有(d1, d2, d3,…,dm),最少需要多少枚硬币。 问题:需找零金额为8,硬币面值有(1, 3, 2, 5),最少需要多少枚硬币。 设F(j)表示总金额为j时最少的零钱数,F(0) = 0,W表示找零金额,有零钱一堆{d1, d2, d3,…,dm}。同样根
阅读全文
摘要:在上一篇《9.动态规划(2)——子集和问题》中,谈到了什么是子集和问题,以及实现。背包问题实际也是子集和问题的一种,不过背包问题不是“判断问题”而是一个“最优问题”。而背包问题实际上又分为“0-1背包”,“完全背包”,本文对“0-1背包”进行讲解。 问题:有n个物品,每个物品的重量为weigh[i]
阅读全文
摘要:注:因为对“子集和问题”的学习不够深入,所以本文在讲解动态规划递推公式中可能存在叙述不清,或者错误的地方,如有发现望能不吝赐教。 子集和问题可描述如下:给定n个正整数W=(w1, w2, …, wn)和正整数M,要求寻找这样一个子集I⊆{1, 2, 3, ..., n},使得∑wi=M,i∈I[1]
阅读全文
摘要:动态规划的算法题往往都是各大公司笔试题的常客。在不少算法类的微信公众号中,关于“动态规划”的文章屡见不鲜,都在试图用最浅显易懂的文字来描述讲解动态规划,甚至有的用漫画来解释,认真读每一篇公众号推送的文章实际上都能读得懂,都能对动态规划有一个大概了解。 什么是动态规划?通俗地理解来说,一个问题的解决办
阅读全文
摘要:哈希(Hash)又称散列,它是一个很常见的算法。在Java的HashMap数据结构中主要就利用了哈希。哈希算法包括了哈希函数和哈希表两部分。我们数组的特性可以知道,可以通过下标快速(O(1))的定位元素,同理在哈希表中我们可以通过键(哈希值)快速的定位某个值,这个哈希值的计算就是通过哈希函数(has
阅读全文
摘要:快速排序(简称快排)因为其效率较高(平均O(nlogn))经常在笔试题中对其考查。 对于快排的第一步是选取一个“基数”,将会用这个“基数”与其它数进行比较交换。而这个“基数”的选择将影响到快排的效率如何,但如果为了选择基数而选择基数则会本末倒置。例如为了找到最佳基数,则需要在整个待排序列中找到中位数
阅读全文
摘要:在上一节中讲解了归并排序的递归版《4.比较排序之归并排序(递归)》,通常来讲,递归版的归并排序要更为常用,本节简单介绍下非递归版的归并排序。思路和递归版相同,均为先分解后合并,非递归的重点在于如何确定并合理的分解待排序数组。 对于递归我们是这么做的: 对于非递归来讲,切分的不向递归从大到小,非递归实
阅读全文
摘要:归并排序里运用到算法里很重要的一个思想——分治法:将原问题分解为几个规模较小但类似于原问题的子问题——《算法导论》。在每一层递归中都有3个步骤: 1.分解问题 2.解决问题 3.合并问题的解 举例待排序数组:{6, 5, 3, 1, 7, 2, 4},将它原始序列做分解。 可以经过不断的递归分解可以
阅读全文
摘要:对于堆排序会涉及一些完全二叉树知识。对于待排序列{10, 2, 11, 8, 7},把它看成是一颗完全二叉树,如下图所示。 堆分为大根堆和小根堆:大根堆表示每个根节点均大于其子节点(L(i) >= L(2i) && L(i) >= L(2i + 1)),小根堆表示每个根节点均小于其子节点(L(i)
阅读全文
摘要:梳排序的知名度远没有其他排序算法那么高,它是在冒泡排序的基础上做的改进,引入类似“步长”以及“子序列”概念,这两个概念在后面的排序算法中会经常提及。 待排序列:{10, 2, 11, 8, 7} groupNums = length = 5 步长系数(分组系数)coefficient = 1.3 排
阅读全文
摘要:冒泡排序可以说是在排序算法中最为入门级别的算法之一了。因为其简单易于理解,常在课堂中作为排序的入门算法。 冒泡排序见名生意,其排序过程如同水里的泡一般由下往上逐级递升。下图所示为冒泡排序过程:假设待排序序列为{10, 2, 11, 8, 7}。 Java Python3
阅读全文