左耳听风ARTS第十周

Algorithms

448. Find All Numbers Disappeared in an Array
Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements of [1, n] inclusive that do not appear in this array.

Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.

Example:

Input:
[4,3,2,7,8,2,3,1]

Output:
[5,6]

Solution 1——leetcode上的思路:第一次遍历数组,将数组中的值都转换成负数;第二次遍历,如果数组中的数值大于0,意味着对应下标值不在数组中。

class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> ret = new ArrayList<Integer>();
        
        for(int i = 0; i < nums.length; i++) {
            int val = Math.abs(nums[i]) - 1;
            if(nums[val] > 0) {
                nums[val] = -nums[val];
            }
        }
        
        for(int i = 0; i < nums.length; i++) {
            if(nums[i] > 0) {
                ret.add(i+1);
            }
        }
        return ret;
    }
}

Review

Programmers Don’t Read Books–But You Should
1、过时的代码学习方式——撸起袖子,收集网络上的二手资料,复制粘贴代码。
2、绝大多数软件工程师在他们所属的领域并没有读过一本相关的书籍,代码质量令人非常堪忧。
3、最好的编程书籍不会过时,它们会告诉你为什么,而不是怎样去做。

Tips

网络协议基础知识:传输层——TCP
1、发送端的缓存数据结构包括四个部分:发送已确认、发送未确认、未发送可发送和未发送不可发送。
在这里插入图片描述
2、接收端缓存的数据结构包括三个部分:接受已确认、等待接收未确认和不能接收。
在这里插入图片描述
3、重传机制:超时重传和基于重复累计确认的重传。

超时重传:通过自适应重传算法来设置超时时间,如果重传定时器被触发,仍然没有收到ACK,定时器的值将加倍。这种方法可对抗中间人攻击方式的拒绝服务攻击。

先了解下累计应答:对 N 的应答意味着字节 N 和所有之前的字节都已经收到。
累计确认重传:如果接收方发现6、8、9都已经接收了,就是7没来,那肯定是丢了,于是发送三个6的ACK,要求下一个是7。发送端收到3个ACK,不等超时,马上重发7。阈值设为3可以减少乱序包导致的无作用的重传现象。

选择确认(SACK):前提是需要发送端和接收端都支持这一功能。在TCP头里加一个SACK的字段,可以将缓存的信息发送给发送方。例如,接收方可以发送ACK6、SACK8、SACK9,发送方可以立刻发现7丢了。

4、流量控制:通过滑动窗口协议来控制。接收端给发送端的确认包里会携带一个窗口的大小。如果接收端数据处理不过来或者网络环境差等情况导致窗口大小为0的时候,发送方会定时发送窗口探测数据包,看是否有机会调整窗口的大小。为了防止低能窗口综合征,发送方可以使用纳格算法,接收方可以使用David D Clark算法。

5、拥塞控制:发送方根据网络的承载情况控制分组的发送量,以获取高性能又能避免拥塞崩溃。
拥塞控制算法:慢启动、快速重传、TCP BBR 算法。

Share

Google’s BBR拥塞控制算法模型解析

猜你喜欢

转载自blog.csdn.net/wuweiwoshishei/article/details/86551056