首页
学习
活动
专区
工具
TVP
发布

大闲人柴毛毛

专栏成员
189
文章
259787
阅读量
63
订阅数
10分钟搞懂蚁群算法
蚂蚁几乎没有视力,但他们却能够在黑暗的世界中找到食物,而且能够找到一条从洞穴到食物的最短路径。它们是如何做到的呢? 蚂蚁寻找食物的过程 单只蚂蚁的行为及其简单,行为数量在10种以内,但成千上万只蚂蚁组成的蚁群却能拥有巨大的智慧,这离不开它们信息传递的方式——信息素。 蚂蚁在行走过程中会释放一种称为“信息素”的物质,用来标识自己的行走路径。在寻找食物的过程中,根据信息素的浓度选择行走的方向,并最终到达食物所在的地方。 信息素会随着时间的推移而逐渐挥发。 在一开始的时候,由于地面上没有信息素,因此蚂蚁们的行走
大闲人柴毛毛
2018-03-29
8.2K7
程序员必知的并发编程注意事项
获取单例对象需要保证线程安全,其中的方法也要保证线程安全。 单例对象会被多线程共享,因此要保证它是线程安全的,它其中的方法都要保证是线程安全的。 工具类、资源驱动类、单例工厂类都要注意这个问题。 创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者 “过度切换”的问题。
大闲人柴毛毛
2018-03-29
1.3K0
回溯法(一)——n皇后问题
问题描述 在一个n*n的棋盘上放置皇后,要求:一个皇后的同一行、同一列、同一条对角线上不允许出现其他皇后。请给出所有的放置方案。 算法思路 思路很简单,由于每行每列不能出现两个皇后,因此每行只能放一
大闲人柴毛毛
2018-03-12
1.6K0
柴毛毛大话设计模式——开发常用的设计模式梳理
写在最前 本文是笔者的一点经验总结,主要介绍几种在Web开发中使用频率较高的设计模式。 本文篇幅较长,建议各位同学挑选感兴趣的设计模式阅读。 在阅读的同时,也麻烦各位大佬多多分享!有你们的肯定,才有我
大闲人柴毛毛
2018-03-09
1.2K0
贪心算法(五)——迪杰斯特拉算法
问题描述 给一个有向无环带权图,并给一个起点,求出该原点到所有顶点的最短路径。 数据结构 dis: Map<String,Integer> dis; 存储原点s到指定节点的最短路径长度。 k
大闲人柴毛毛
2018-03-09
8400
贪心算法(四)——最小代价生成树
问题描述 n个村庄间架设通信线路,每个村庄间的距离不同,如何架设最节省开销? 这个问题中,村庄可以抽象成节点,村庄之间的距离抽象成带权值的边,要求最节约的架设方案其实就是求如何使用最少的边、最小的权值和将图中所有的节点连接起来。 这就是一个最小代价生成树的问题,可以用Prim算法或kruskal算法解决。 PS1:无向连通图的生成树是一个极小连通子图。 PS2:生成树是图的一个子图,包括所有的顶点和最少的边(n-1条边)。 PS3:最小代价生成树就是所有生成树中权值之和最小的那个。 算法思路 算
大闲人柴毛毛
2018-03-09
2.9K0
贪心算法(二)——一般背包问题
题目 有一个背包,最多放M kg的物体(物体大小不限); 有n个物体,每个物体的重量为Wi,每个物体完全放入背包后可获得收益Pi。问:如何放置能获得最大的收益? 注:背包问题分为两种,若每个物体不可分割,则称为0/1背包问题,这种问题无法用贪心法求的最优解,只能求的近似解。而若每个物体可以切分,则称为一般背包问题,可以使用贪心法求的最优解。下面讨论的就是一般背包问题。 结果集 一般背包问题中,结果集可以用一个n元组表示: 1. x的下标i表示物体的序号; 2. xi表示第i个物体加入背包
大闲人柴毛毛
2018-03-09
2.1K0
贪心算法(一)——概述
贪心法用于求解最优化问题,即求解某一问题的最优解。 既然能用贪心法求解的问题是一个最优化问题,那么我们首先来了解下最优化问题的几个基本概念。 最优化问题的几个基本概念 目标函数 解决一个最优化问题,首先要将问题抽象成一个数学函数,这也就是一个数学建模的过程,这个能够描述问题的函数就称为『目标函数』,这个函数的最大/小值就是我们要求的最优值。 约束条件 任何函数都有它的取值范围,所有取值范围的集合就称为『约束条件』。 可行解 满足所有约束条件的解称为『可行解』。 最优解 满足约束条件,并
大闲人柴毛毛
2018-03-09
1.1K0
动态规划法(一)——概述
什么是动态规划法 动态规划法也是用于求解最优化问题,也采用分步决策的策略,将一个大问题划分成若干个较小的同类子问题,根据子问题的解,自底向上,得出整个问题的解。 与贪心法的异同 相同 都是用于求解最优化问题; 都采用分步决策,计算出每一步的最优解。 不同 贪心法的每一步决策依赖于『最优量度标准』,不依赖于子问题的解和尚未作出的选择; 动态规划法每一步决策依赖于子问题的解,无需最优量度标准。 与分治法的异同 相同 都将问题话分成若干个规模较小的同类型子问题。 不同 分治法会有重叠子问题的现象,对于一些子问题
大闲人柴毛毛
2018-03-09
6830
动态规划法(二)——弗洛伊德算法
问题描述 给定一个带权有向图,计算任意两结点间的最短路径。 迪杰斯特拉算法可以计算指定起点到所有结点的最短路径长度,因此分别对每个结点使用一次迪杰斯特拉算法即可求的任意两结点间的最短路径。迪杰斯特拉算法的时间复杂度为O(n^2),因此采用这种方法的时间复杂度为O(n^3)。 但是,迪杰斯特拉算法不允许权值为负数,因此需要使用弗洛伊德算法。 弗洛伊德算法允许权值为负数的边,但不允许回路的路径长度为负数。因为,若回路长度为负数,那么走一次回路,路径长度一定比上一次小,故这个问题就没有意义了。 数
大闲人柴毛毛
2018-03-09
1.1K0
动态规划法(四)——0/1背包问题
问题描述 有n个物体,重量分别是w0~wn-1,每个物体放入背包后可获得的收益分别为p0~pn-1,背包载重为M,且所有物体要么放要么不放,不能只放一部分。求如何放物体可以得到最高的收益。 问题分析 设f(i,m)表示第i步背包的总收益,其中i表示当前进行到了第i步,m为当前背包载重,则当前第i步只有两种选择: 将第i个物体放入背包 此时背包总收益就变成f(i-1,m-wi)+wi。 第i个物体不放入背包 此时背包总收益就是f(i-1,m)。 第i步究竟怎么选择,知道就取决于这两种选择那个结
大闲人柴毛毛
2018-03-09
9270
动态规划法(五)——多段图问题
问题描述 给定一个多段图,求出多段图中的最短路径和最短路径长度。 什么是多段图? 多段图是一个有向、无环、带权 图。 有且仅有一个起始结点(原点source) 和 一个终止结点(汇点target)。
大闲人柴毛毛
2018-03-09
1.9K0
计算机网络传输层知识点全覆盖
传输层概述 作用:传输层为它上面的应用层提供通信服务。 在OSI七层参考模型中,传输层是面向通信的最高层,也是用户功能的最底层。 传输层两大重要的功能:复用 和 分用。 复用:在发送端,多个应用进程公用一个传输层; 分用:在接收端,传输层会根据端口号将数据分派给不同的应用进程。 和网络层的区别: 网络层为不同主机提供通信服务,而传输层为不同主机的不同应用提供通信服务。 网络层只对报文头部进行差错检测,而传输层对整个报文进行差错检测。 UDP(用户数据报协议)详解 UDP的特点 UDP只在IP数
大闲人柴毛毛
2018-03-09
1.4K0
剑指 offer代码解析——面试题38数字在排序数组中出现的次数
题目:统计一个有序数组中K出现的次数。 分析:本题最直观的思路就是遍历数组,统计K出现的次数即可。 这种方式的时间复杂度为O(n)。下面我们充分利用“有序数组”这一条件,提高算法的时间效率。 对于一个有序数组,所有的数字K一定都集中在一起,因此只要我们找到这一组K的头和尾就能知道K出现的次数。 此时问题就转化为:在一个有序数组中寻找某个数字。 我们很自然地就想到了二分搜索,在目前所有的搜索算法中,二分搜索具有最高的搜索效率。 对于本题,我们需要进行两次二分搜索,一次寻找K的头,一次寻找K的尾。
大闲人柴毛毛
2018-03-09
6130
剑指 offer——面试题8求旋转数组的最小值
题目:将一个非递减序列的某一处切一刀,再把前半段序列放到后半段序列的后面,这样组成的新序列叫做“旋转数组”。要求获取一个旋转数组的最小值。 这本质上是一个求最值的问题,最简单的方法就是顺序遍历数组,从中找出最小值,该方法的时间复杂度为O(n)。但这种方法会被面试官鄙视的,所以我们寻找更为高效的办法。 这道题给的数组是一个“旋转数组”,旋转数组是将一个非递减数组切成两个数组后重新组装而成的,旋转数组的前半段所有元素值均大于等于后半段元素的值,两段的分界点就是最小值。 要寻找分界点,可以采用对半搜索,若第一个元
大闲人柴毛毛
2018-03-09
9750
剑指offer代码解析——面试题31连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组和的最大值。要求时间复杂度为O(n) 分析:统计连续子数组的最大值最直观的方法就是遍历数组n次,每次以a[i]作为子数组的起点,然后将a[i]后面的数字依次纳入数组中,计算最大值。这种方式的时间复杂度为O(n^2),显然不符合要求。下面我们根据数组自身的特点来统计连续子数组的最大值。 我们尝试从左向右遍历数组,并且进行累加。我们就会发现:如果当数组累加到a[i]后,累加的结果反而小于a[i]本身,那就说
大闲人柴毛毛
2018-03-09
7660
三分钟理解“桥接模式”——设计模式轻松掌握
什么是桥接模式? 将两个继承体系使用聚合/组合连接在一起,这就是桥接模式。 桥接模式的类图 桥接模式中,最大的特色就中两个继承体系中间的那座桥(聚合/组合)。 桥接模式中有两个继承体系,分别称为“抽象
大闲人柴毛毛
2018-03-09
1K0
三分钟理解“原型模式”——设计模式轻松掌握
原型模式的官方定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 大白话: 现在有一个类,它要产生大量的对象,而且这些对象中的属性值大部分都相同;如果我们要获取这样一个对象的时候每次都通过new,然后再set每一个属性值,那么这样就太麻烦了。这种情况下使用原型模式非常便捷: 我们让这个类去实现ICloneable接口,并且实现该接口的clone()函数,在clone函数中让当前对象进行一次浅拷贝/深拷贝,总之就是克隆一个当前对象来,这样我们就无需new完了对象后再逐个set属性了。 原
大闲人柴毛毛
2018-03-09
7430
三分钟理解“模板方法模式”——设计模式轻松掌握
模板方法模式的官方定义: 在模板方法模式中,只定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 大白话讲: 当一个函数的流程都能够确定,但某些具体的步骤会根据情况的不同而不同。此时可以使用模板方法模式,将函数中能确定的部分都写出来,不确定的部分用本类中的抽象函数代替;当需要使用该函数时,需要创建一个实现该类中所有抽象函数的子类,当通过子类调用该算法时,当执行到算法中的抽象函数时,由于多态的特性,系统会自动调用子类中已经重写好的函数,从而
大闲人柴毛毛
2018-03-09
6880
没有更多了
社区活动
【纪录片】中国数据库前世今生
穿越半个世纪,探寻中国数据库50年的发展历程
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档