堆栈图是否需要 n 平方 space?

Does map of stacks require n square space?

我正在研究这个 geeksforgeeks question:

Check Mirror in N-ary tree

Given two n-ary trees. Check if they are mirror images of each other or not. You are also given e denoting the number of edges in both trees, and two arrays, A[] and B[]. Each array has 2*e space separated values u,v denoting an edge from u to v for the both trees.

所以给定的参数是两个数组,表示两棵树的节点之间的边(arr1[0] 有一个边 arr1[1]arr1[2] 有一个边 arr1[3]等等)。

我使用两个 2-D 向量来做到这一点,方法是将两棵树的边推到它们的节点上,然后反转一棵树的所有边,最后检查现在两棵树的所有边是否相同。

这是一个正确的答案,但所需的最佳解决方案应该是使用 O(n) space,我显然违反了使用二维数组的要求。 (n=节点数)

他们的解决方案使用定义为 map<int,stack<int>> m 的地图,然后使用与我使用的类似的方法。

我的问题是,它真的是 O(n) space 的解决方案吗?堆栈映射不需要 n2 space 因为每个索引都将使用 O(n) 大小的堆栈?

此外,任何关于任何其他最佳解决方案的提示(关于 space,我希望自己找到及时的最佳解决方案)将不胜感激。

我认为你是对的。基于 map<int,stack<int>> m 的解决方案总计为 O(n2) space。而且我认为不可能用少于 space 的数量来做到这一点,因为让我们说比较级别 k,你需要存储所有的节点来检查它们是否反向订购与否。任何级别 k > =2,考虑到 root = level 1 都会有超过 n 个节点。 在时间复杂度方面,我认为我有一个更好的解决方案,它不使用任何地图,因为地图需要 O(logn) 时间来插入或搜索。

using pii = pair<int, int>;
int checkMirrorTree(int n, int e, vi A, vi B) {
    if(e==0)return true;
    if(A[0]!=B[0])return false;
    queue<int> q;
    q.push(A[0]);
    int i = 0;
    while(i<(2*e) && !q.empty()){
        int c = q.size();
        vector<pii> arr, arr1;
        w(i, c);ce
        while(c--){
            int root = q.front();
            q.pop();
            while(i<(2*e) && A[i]==root){
                q.push(A[i+1]);
                arr.push_back({A[i], A[i+1]});
                arr1.push_back({B[i], B[i+1]});
                i+=2;
            }   
        }
        w(i, c);ce
        int j=0;int k = arr.size()-1;
        w(k, j);ce
        w(arr, arr1);ce
        while(j<=k){
            if(arr[j]!=arr1[k])return false;
            j++;
            k--;
        }
    }
    return true;
}

首先在定义上有一些歧义 :提到了 -ary 树和节点。为了避免混淆,让我们来谈谈 -ary 树。但老实说,我认为最初的问题(在 GfG 上)不应该说“-ary 树”(它说明了分支因子,参见 Wikipedia),而是“有节点的树”。

Does map of stacks do not require n squared space as every index will be using a stack of O(n) size ?

不,即使一个堆栈 可以 有 O() 大小,一个如此大的堆栈限制了其他堆栈的大小。一棵树有 O() 条边——实际上,正好是 −1 条边——所以堆栈大小的 sum 仍然是 O(),所以总内存使用量是 O () 用于映射中的 key/reference 对,O() 用于堆栈,总计 O().