Origin of Ray

一起探索互联网的秘密

特点

  • TCP是面向连接的运输层协议。也就是说,应用程序在使用TCP连接之前,必须建立TCP连接。数据传输完毕之后,必须释放TCP连接。
  • 每一条TCP连接只能有两个端点,每个TCP连接都是点对点的。
  • TCP提供可靠交付服务,也就是说数据是无差错,不丢失,不重复,按照顺序到达。
  • TCP提供全双工通信,允许通信双方在任何时候都能够发送数据,TCP双方都设有发送缓存和接收缓存,用来临时存放双方通信的数据。
  • 面向字节流。TCP中的**“流”指的是流入到进程或从进程流出的字节序列**。面向字节流的含义是:虽然应用程序和TCP交互是一次一个数据块,但是TCP把应用程序交下来的数据仅仅看成是一连串无结构的字节流。TCP并不知道所传送的字节流的含义,也不保证接收方收到的数据块大小与发送方的数据块大小有什么对应关系,有可能发送发10个数据块的数据在接收方被整理成4个数据块交付给上层。
阅读全文 »

OAuth的中文名称是开放式授权协议,这个名字大家仔细品,它是一个授权协议,任何实现这个协议的网站都可以在用户同意的条件下给某些在自己这里注册的应用授予对应用户在本网站某些资源的权限,而这个权限一般用token来表示。

阅读全文 »

原理

快慢指针

双指针技巧再分为两类,一类是「快慢指针」,一类是「左右指针」。前者解决主要解决链表中的问题,比如典型的判定链表中是否包含环;后者主要解决数组(或者字符串)中的问题,比如二分查找。

阅读全文 »

原理

二分查找并不简单,Knuth 大佬(发明 KMP 算法的那位)都说二分查找:思路很简单,细节是魔鬼。很多人喜欢拿整型溢出的 bug 说事儿,但是二分查找真正的坑根本就不是那个细节问题,而是在于到底要给 mid 加一还是减一,while 里到底用 <= 还是 <

你要是没有正确理解这些细节,写二分肯定就是玄学编程,有没有 bug 只能靠菩萨保佑。

阅读全文 »

原理

滑动窗口算法的思路是这样:

1、我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」。

2、我们先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的字符串符合要求(包含了 T 中的所有字符)。

3、此时,我们停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串不再符合要求(不包含 T 中的所有字符了)。同时,每次增加 left,我们都要更新一轮结果。

4、重复第 2 和第 3 步,直到 right 到达字符串 S 的尽头。

阅读全文 »

广度优先搜索

通过一道题目地图分析,来讲解和实践BFS。

原理

考虑最朴素的方法,即求出每一个海洋区域(grid[i][j] == 0 的区域)的「最近陆地区域」,然后记录下它们的距离,然后在这些距离里面取一个最大值。

阅读全文 »

最近在做题的时候遇到了递归,隐约感觉与动规有点相似,但自已又说不清楚,于是找了很多文章,这里摘录一片最基础但也是最清楚的文章,原文链接是这个

原理

动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列呀,最小编辑距离呀等等。

既然是要求最值,核心问题是什么呢?求解动态规划的核心问题是穷举。因为要求最值,肯定要把所有可行的答案穷举出来,然后在其中找最值呗。

动态规划就这么简单,就是穷举就完事了?我看到的动态规划问题都很难啊!

首先,动态规划的穷举有点特别,因为这类问题存在「重叠子问题」,如果暴力穷举的话效率会极其低下,所以需要「备忘录」或者「DP table」来优化穷举过程,避免不必要的计算。

阅读全文 »

原理

最近在做题的时候遇到了好几次回溯算法,每次都是慢慢试出来的,所以就去找一下有没有什么抽象出来的思路可以参考,于是找了很多文章,这里摘录一片最基础但也是最清楚的文章,原文链接是这个

解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:

1、路径:也就是已经做出的选择。

2、选择列表:也就是你当前可以做的选择。

3、结束条件:也就是到达决策树底层,无法再做选择的条件。

阅读全文 »

有了IP地址以及路由表的设计之后,我们就要继续考虑如何去获取路由信息,也就是路由器之间如何去交换信息,如如何表达自己对其他路由器的可达性,获取路由信息之后,我们还要想办法构造路由表。

阅读全文 »
0%