转载:程序员如何把控自己的职业
感觉这篇文章非常棒,陈皓老师的见解分享了自己的认知和看法,让人收获不小
本文转载于 酷 壳 – CoolShell,作者陈皓
这篇文章的主要内容主要是我今年3月份在腾讯做的直播,主要是想让一些技术人员对世界有一个大体的认识,并且在这个认识下能够有一个好的方法成就自己。而不是在一脸蒙圈的状态下随波逐流,而日益迷茫和焦虑。直播完后,腾讯方面把我的直播形成文字的形式发了出来,我觉得我可以再做一个精编版。所以,有了这篇文章,希望对大家有帮助。
对我来说,在我二十多年的工作经历来看,期间经历了很多技术的更新换代,整个技术模式、业务模式也是一直变来变去,我们这群老程序员成长中所经历的技术比今天的程序员玩的还更杂更多。我罗列一下我学过的,而且还被淘汰掉的技术,大家先感受一下。
12345678- MIS应用开发:FoxPro,PowerBuilder,Delphi- OA:Lotus Notes,VBScripts- 微软:ODBC/ADO,COM/DCOM,MFC/ATL,J++- 服务器:AIX,HP-UX,SCO Unix- Web:CGI,ISAPI,SOAP- RPC:CICS,T ...
校园的花开了
分享一下久违的春天的气息:)
马上就要到五一了,家乡的槐花马上就可以吃了,东北的春天才刚刚到来(前几天还刚刚下了雪…)
下面两张是在学校墙的空间偷的
计算机组成:无符号数和有符号数
[TOC]
1.无符号数
直接用二进制表示。
寄存器的位数反映了无符号数的表示范围。
2.有符号数1.机器数与真值保存在计算机中的数字我们称为机器数 ,我们平时用的带有符号的真实的值称为真值 。在计算机中用0或1 表示数字的符号 。
大家注意,在计算机中没有专门的硬件用于表示小数点,计算机中的小数点都是以约定的方式给出的。
2.原码表示法整数我们这里以数学的方式给出原码表示法的定义
注意到对于一个位数为 n 的正整数,即使所有数位上的值都是 1 ,这是值达到最大值 $$2^n-1$$ ,所以上面第一个范围是$$ 2^n>x>=0$$
根据上面公式可以看出,如果 $$x$$ 的值为 0 ,则有两种表示方式 。
下面是一个具体的实例:
我们不难发现,
对于正整数而言,取符号位为 0 ,后面直接加上真值的二进制表示即可
对于负整数而言,取符号位为 1,后面直接加上真值的绝对值的二进制表示即可
由此,我们得出结论:原码是带符号的绝对值表示!
小数接下来我们来看一下小数的原码表示,同样不难发现,小数 0 同样有两种表示方法。
我们再来看四个例子
...
如何实现最小生成树(Kruskal算法与Prim算法)
如何理解与实现最小生成树呢?Prim算法与Kruskal算法背后的思想又是怎么样的呢?一起来探索吧~
文章目录:
1.概念和性质
2.思路探索
3.Kruskal算法
4.Prim算法
5.代码实现
1.概念和性质今天我们考虑的模型是加权无向图,问题是如何获取它的一幅最小生成树!首先,我们给出最小生成树的定义:
图的生成树是它的一棵含有其所有顶点的无环连通子图。一幅加权图的最小生成树(MST)是它的一棵权值(树中所有边的权值之和)最小的生成树。
如图所示:
首先,我们给出一些约定来简化问题(这并不会影响我们理解问题)
只考虑连通图(如果不连通的话是不存在最小生成树的)
边的权重可能是0或者负数
所有边的权重各不相同(我们给出这个假设之后对于一幅图来说只存在唯一的最小生成树,这样方便我们理解,但是如果把这个限制条件去掉,我们之前得到的算法依然有效😎)
简而言之,我们的讨论对象是一幅权重各不相同的加权无向图,任务是求最小生成树的每条边。接下来,我们一起思考如何实现这个算法!
2.思路探索
1)我们的任务是求得最小生成树的每条边,也就是我只要确定了这些边,自然而然也就唯一确定 ...
有向环、拓扑排序与Kosaraju算法
25张图详解有向环、拓扑排序与Kosaraju算法。有向环如何检测?拓扑排序的原理?Kosaraju算法又是如何得到的?本文告诉你答案
首先来看一下今天的内容大纲,内容非常多,主要是对算法思路与来源的讲解,图文并茂,希望对你有帮助~
1.有向图的概念和表示概念有向图与上一篇文章中的无向图相对,边是有方向的,每条边所连接的两个顶点都是一个有序对,它们的邻接性都是单向的。
一幅有方向的图(或有向图)是由一组顶点和一组有方向的边组成的,每条有方向的边都连接着一对有序的顶点。
其实在有向图的定义这里,我们没有很多要说明的,因为大家会觉得这种定义都是很自然的,但是我们要始终记得有方向这件事!
数据表示我们依然使用邻接表存储有向图,其中v-->w表示为顶点v的邻接链表中包含一个顶点w。注意因为方向性,这里每条边只出现一次!
我们来看一下有向图的数据结构如何实现,下面给出了一份Digraph类(Directed Graph)
1234567891011121314151617181920212223242526272829303132333435363738394041package ...
最短路径之如何理解“松弛”or“放松”?
地图软件是如何计算出最优出行路径的?一切要从relaxation:“松弛”or“放松”说起~
最短路径问题的目的是找到从一个顶点到达另一个顶点的成本最小的路径。最短路径算法被广泛地应用于解决各种复杂的问题,比如在地图中寻找两个地点之间的最短路径,如何在网络连接中为路由器寻找最短的传输路径等等。为了实现最短路径算法,人们发明了一系列的算法,比如:Dijkstra算法与Bellman-Ford算法。但是这些算法都基于一个被称为放松的基本操作
relaxtion,有些人称为松弛,我就直接简单翻译为放松了,别管怎么叫,理解就行
在这篇文章中,我会详细介绍放松操作,同时给出解决最短路径问题的基本(通用)思想。
这篇文章的大纲是:
1.什么是最短路径问题?
2.怎样理解边的放松?
3.边的放松顺序重要吗?
4.无环加权图的最短路径算法
1.什么是最短路径问题?我们接下来要讨论的问题被称为单源最短路(Single-Source Shortest Path),通俗来讲,就是给定一幅加权图和一个特定的顶点s,称为源;我们的目标是对于图中任意一点v,计算从源s到达v的最短路径
G=( ...
深度优先搜索与广度优先搜索
27张图,万字长文,紧紧追踪算法的每一步!深搜与广搜如何理解?它们又有哪些重要的应用呢?本文全部告诉你~
约定:本文所有涉及的图均为无向图,有向图会在之后的文章设计
1.图的存储方式我们首先来回顾一下图的存储方式:邻接矩阵和邻接表。为了实现更好的性能,我们在实际应用中一般使用邻接表的方式来表示图。
具体的实现代码为:
12345678910111213141516171819202122232425262728293031323334package Graph;import java.util.LinkedList;public class Graph{ private final int V;//顶点数目 private int E;//边的数目 private LinkedList<Integer> adj[];//邻接表 public Graph(int V){ //创建邻接表 //将所有链表初始化为空 this.V=V;this.E=0; adj=new Li ...
什么是“图”?
我们从柯尼斯堡的七桥问题着手,开始介绍图算法的相关内容,这个问题是基于一个现实生活中的事例:河中心有两个小岛。小岛与河的两岸有七条桥连接。在所有桥都只能走一遍的前提下,如何才能把这个地方所有的桥都走遍?它被认为是图论的起源。
1、背景
欧拉在1735年提出,并没有方法能圆满解决这个问题,他更在第二年发表在论文《柯尼斯堡的七桥》中,证明符合条件的走法并不存在
欧拉把实际的抽象问题简化为平面上的点与线组合,每一座桥视为一条线,桥所连接的地区视为点。这样若从某点出发后最后再回到这点,则这一点的线数必须是偶数,这样的点称为偶顶点。相对的,连有奇数条线的点称为奇顶点。由于柯尼斯堡七桥问题中存在4个奇顶点,它无法实现符合题意的遍历。
之后,不少数学家都尝试去解析这类事例。而这些解析,最后发展成为了数学中的图论233。
2、图的概念
图的定义:图是由一组顶点和一组能够将两个顶点相连的边组成的
图是一种非线性表数据结构,图中的元素我们叫做顶点,图中建立的连接关系我们叫做边。,图主要分为四种:无向图、有向图、加权图、加权有向图。
我们把有边有方向的图叫做“有向图”,把边没有方向的图叫做“无向图” ...
如何理解与实现散列表
散列表(Hash table),也叫做哈希表,是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,它充分利用了数组支持按照下标随机访问元素的特性这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。
散列表的概念
散列表是算法在时间和空间上做出权衡的经典例子。如果没有内存的限制,我们可以直接将键作为数组的索引(可能超级大),那么所有的查找操作只需要访问内存一次即可完成。另一方面,如果没有时间的限制,我们可以使用无序数组并进行顺序查找,这时只需要很小的内存但是耗时严重。而散列表则是在这两者之间找到了一种平衡。
散列函数散列函数,顾名思义,它是一个函数。我们把它定义成 hash(key) ,其中 key 表示元素的键值,则 hash(key) 的值表示经过散列函数计算得到的散列值。它的任务就是将键转化为数组的索引。
该如何构造散列函数呢?基本要求:
1.散列函数计算得到的散列值是一个非负整数
2.如果 key1 = key2,那 hash(key1) = ...
三十张图助你看清红黑树的前世今生
在《算法》(第4版)中,红黑树的实现直接采用了左倾红黑树 (LLRB) 的方法,左倾红黑树可以用更少的代码量实现红黑树,在本文中我也使用他的方法理解。相比于经典红黑树,增加了一个限制红节点一定是父节点的左子节点,但是实现却容易不少
一、红黑树的定义1.每个节点要么是黑色要么是红色;
2.根节点是黑色;
3.每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据;
4.任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的;
5.每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点;
这就是红黑树的定义,但你看完肯定会一脸懵,我也是一样。我会想:红黑树的来源是什么?为什么要区分红色和黑色节点呢?这些性质是怎么来的,或者有什么作用?不着急,你听我慢慢道来,我希望,你能够通过这篇文章对红黑树有一个清晰的认识,包括它的来历,意义以及各种操作。
二、平衡二叉查找树首先,还记得咱们上次文章中介绍的二叉查找树吗?尽管它具有不错的性能,但是仍然无法避免极端的情况。一般的二叉查找树的生成和数据插入的顺序密切相关,我们来看一组情况:
我们依次插入[B,A, ...