关于并查集(Disjoint Set Union或Union Find)
上面说的有点抽象了,下面来看具体可以解决什么问题,比如现在有[1...n]共n个点,给你一些类似(1,2)这样的数据,表示点1和点2是相互连接的,属于同一个子集。要查询总共有多少个子集,或者随便给个点m,要查m属于哪一个子集。
上面说的有点抽象了,下面来看具体可以解决什么问题,比如现在有[1...n]共n个点,给你一些类似(1,2)这样的数据,表示点1和点2是相互连接的,属于同一个子集。要查询总共有多少个子集,或者随便给个点m,要查m属于哪一个子集。
想象我们有一个缓存系统,里面以key-value的形式存储了很多缓存数据,但存储空间总是有限的,如果我们不断的接受请求,那么总有存满的一天。当存储空间存满了之后,我们就要通过某种方式去释放空间
有一个数组arr,我们需要频繁对arr中的子数组进行更新,比如为子数组的元素+1,容易想到的办法是每次都用一个循环进行更新,但这其实是个时间复杂度O(N)的操作,效率是不高的。有没有什么办法可以高效的进行更新(比如O(1)的时间复杂度)?
我们有如下需求,给出4*4的字母表,我们可以通过把相邻(横向、竖向、斜向都算相邻)的字母连接起来组成一个单词,要找到所有单词
简单的说,就是栈内的元素,满足某种单调性,比如栈内的元素是单调递增的,那么pop()的时候,得到的就一定是当前栈内最大的元素。
我们需要频繁的求任意子数组的元素的和,应该如何求解?最容易想到的就是循环求和,但这是个O(N)的操作。有没有什么办法可以让我们可以用O(1)的时间复杂度来得到子数组的和?