22 Matching Annotations
  1. Sep 2024
    1. 属性不依赖于其它非主属性

      非主键字段必须直接依赖于主键,而不能通过其他非主键字段间接依赖于主键

    1. 保证客户端发送的最后一个ACK报文段能够到达服务端

      保证被动关闭连接的一方能正确关闭

    2. 在2MSL等待期间,定义这个连接的插口(客户的IP地址和端口号,服务器的IP地址和端口号)不能再被使用

      在2MSL的Time_Wait时间内,该TCP连接不能被复用。因此time_wait状态过多,会造成资源浪费。 客户端time_wait状态过多,会导致很多端口被占用,无法向相同目标IP和相同目标Port的服务端建立连接。 服务端time_wait状态过多,会占用很多系统资源。

    1. 为什么需要三次握手,两次不行吗

      阻止历史连接的建立,避免资源浪费。 ⼀个「旧 SYN 报⽂」⽐「最新的 SYN」 报⽂早到达了服务端,那么此时服务端就会回 ⼀个 SYN + ACK 报⽂给客户端,此报⽂中的确认号是 91(90+1)。 客户端收到后,发现⾃⼰期望收到的确认号应该是 100 + 1,⽽不是 90 + 1,于是就会回 RST 报⽂。 在两次握⼿的情况下,服务端在收到 SYN 报⽂后,就进⼊ ESTABLISHED 状态,意 味着这时可以给对⽅发送数据,但是客户端此时还没有进⼊ ESTABLISHED 状态,假设这次 是历史连接,客户端判断到此次连接为历史连接,那么就会回 RST 报⽂来断开连接,⽽服务 端在第⼀次握⼿的时候就进⼊ ESTABLISHED 状态,所以它可以发送数据的,但是它并不知 道这个是历史连接,它只有在收到 RST 报⽂后,才会断开连接。

  2. Jul 2024
    1. -prices[i]

      切忌写成:dp[i-1][1] - prices[i],因为全程只能买入一次

    1. AVL

      AVL树也要满足二叉搜索树的性质: 1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3. 它的左、右子树也分别为二叉搜索树

    1. 优先级队列的定义正好反过来了,可能和优先级队列的源码实现有关

      即: 小顶堆的比较函数是:return a > b; 大顶堆的比较函数是:return a < b;

    1. stack 提供迭代器来遍历stack空间么

      stack 不提供迭代器来遍历其空间: stack 的设计目的是只能访问顶部元素,不支持直接遍历其所有元素。 它只提供了有限的接口,如 push(), pop(), top() 等。 这是为了保持 stack 数据结构的完整性和后进先出的特性。

    2. C++中stack 是容器么

      C++中 stack 是容器适配器,不是容器。 stack 是建立在其他容器之上的容器适配器(container adapter)。 它提供了一个特定的接口来使用底层容器的功能,主要是实现后进先出(LIFO)的数据结构。

    1. 位运算

      位运算不需要额外空间,但是left和right不能相等。 while(left < right){ s[left] ^= s[right]; s[right] ^= s[left]; s[left] ^= s[right]; ++left; --right; }

    1. shared_from_this()是什么意思

      shared_from_this()的作用是使类对象安全的获取自己的 shared_ptr 引用

    2. 当没有共享智能指针指向这个TcpConnection对象时(引用计数为0),这个TcpConnection对象就会被析构删除(堆内存释放)

      由于是在for循环内创建了一个临时的conn对象来持有item.second这个智能指针,然后把item.second这个智能指针释放掉,但item.second指向的堆内存未被释放(现在由conn管理),然后conn在其所属的sub eventloop线程中执行TcpConnection::connectDestroyed(),将conn作为参数传给TcpConnection::connectDestroyed()函数会使conn的引用计数+1,因此即使for循环结束conn离开for循环作用域,其管理的堆内存仍然不会被释放,直到TcpConnection::connectDestroyed()函数执行完毕,没有任何智能指针指向此堆内存了,此TCPConnection对象占用的堆内存才真正被释放

    3. 全局概览Poller、Channel和EventLoop在整个Multi-Reactor通信架构中的角色

      图的说明: 在这个模型中,main reactor(主反应堆)主要负责接受新的客户端连接请求。这包括处理accept事件,接受新连接,并将新连接分派给sub reactor(子反应堆)。

      sub reactor则负责处理具体的I/O事件,如读事件(read)、写事件(write)、以及错误事件(error)。这些I/O事件的处理由sub reactor中的各个EventLoop实例来完成,每个实例都会有自己的PollerChannel来处理具体的事件。

      总结来说: - main reactor负责处理新的连接请求(连接事件)。 - sub reactor负责处理已建立连接的I/O事件(可读、可写、错误事件)。

  3. Apr 2024
    1. UNION:A并B,去除重复部分(不去除交集) UNION ALL:A并B,不去除重复部分(不去除交集) UNION ALL不执行去重操作,效率高

    1. SQL99语法: 内连接:INNER JOIN ON 左外连接:LEFT OUTER JOIN ON 右外连接:RIGHT OUTER JOIN ON 满外连接:FULL OUTER JOIN INNER, OUTER可省略

    1. where name like '_a'; ——第二个字符是下划线,第三个字符是a的name; 或者这样写: where name like '$_a' escaep '$'