我们先来看下什么是序列化,以下定义来自维基百科:

序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。依照序列化格式重新获取字节的结果时,可以利用它来产生与原始对象相同语义的副本。对于许多对象,像是使用大量引用的复杂对象,这种序列化重建的过程并不容易。面向对象中的对象序列化,并不概括之前原始对象所关系的函数。这种过程也称为对象编组(marshalling)。从一系列字节提取数据结构的反向操作,是反序列化(也称为解编组、deserialization、unmarshalling)。

可见,序列化和反序列化在计算机科学中的应用还是非常广泛的。就拿 LeetCode 平台来说,其允许用户输入形如:

1
[1,2,3,null,null,4,5]

这样的数据结构来描述一颗树:

([1,2,3,null,null,4,5] 对应的二叉树)

其实序列化和反序列化只是一个概念,不是一种具体的算法,而是很多的算法。并且针对不同的数据结构,算法也会不一样。本文主要讲述的是二叉树的序列化和反序列化。看完本文之后,你就可以放心大胆地去 AC 以下两道题:

笔者最早接触滑动窗口是滑动窗口协议,滑动窗口协议(Sliding Window Protocol),属于 TCP 协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。 发送方和接收方分别有一个窗口大小 w1 和 w2。窗口大小可能会根据网络流量的变化而有所不同,但是在更简单的实现中它们是固定的。窗口大小必须大于零才能进行任何操作。

我们算法中的滑动窗口也是类似,只不过包括的情况更加广泛。实际上上面的滑动窗口在某一个时刻就是固定窗口大小的滑动窗口,随着网络流量等因素改变窗口大小也会随着改变。接下来我们讲下算法中的滑动窗口。

前端目前比较主流的框架有 react,vuejs,angular 等。 我们通常去搭建组件库的时候都是基于某一种框架去搭建,比如 ant-design 是基于 react 搭建的 UI 组件库,而 elementUI 则是基于 vuejs 搭建的组件库。

虽然目前社区有相关工具,提供框架之间的转化服务,比如讲 vuejs 组件转化为 react 组件。但是毕竟是不同的框架,有不同的标准。因此框架 api 发生变动,那么你就需要重写转化逻辑,显然是不灵活的,因此我们暂不讨论这种情况。作为公司而言,就需要为不同的框架写不同的组件库,尽管逻辑都是一样的。

另外如果框架升级,比如从 1.x 升级到 2.x,那么对应组件库就需要升级,如果公司的组件库有很多(vuejs,react,angular 等),那么这种升级的概率就会更大。

循环移位问题真的是一个特别经典的问题了,今天我们就来攻克它。

循环移位的表现形式有很多种,就数据结构来说包括数组字符串链表等。就算法来说,有包含问题直接移动问题,还有查找问题等。

虽然表现形式有很多,但是本质都是一样的,因为从逻辑上来讲其实他们都是线性数据结构,那么让我们来看一下吧。



博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本站使用 Material X 作为主题 。
载入天数...载入时分秒...