最近,我去接受采访,面试官问我这个问题。
有k + 1个大小1, 2^1, 2^2, 2^3, ...,2^k
的堆栈。我们分别称他们为stack 1, stack 2, ... stack k+1
。当调用insert(x)
时,元素被插入第一个堆栈,即大小为1的堆栈。如果该堆栈已满,则该堆栈的元素将移动到下一个堆栈,然后将元素插入第一个堆栈。它类似于管道操作。堆栈1将元素推送到堆栈2,堆栈2推送到堆栈3,依此类推。如果所有堆栈都已满,那么我们会抛出一个错误,说明堆栈溢出。还有另一个操作,删除(x)。它从堆栈堆栈中删除x。因此,如果x不是最顶层的元素,那就是它不存在于堆栈1中,那么我们从中弹出元素然后移动元素然后再次尝试弹出直到我们找到该元素并将其删除。什么是插入的摊销复杂性&删除此实现?
修改1 :显示插入和删除的工作原理
假设有2个堆栈,堆栈1和堆栈2,大小为2 ^ 0&分别为2 ^ 1
迭代0 :堆栈1 - > {},Stack 2 - > {}
迭代1 :插入(1)。堆栈1 - > {1},堆栈2 - > {},顶部 - > 1
迭代2 :插入(2)。堆栈1 - > {2},堆栈2 - > {1},顶部 - > 2
迭代3 :插入(3)。堆栈1 - > {3},Stack 2 - > {2,1},top - > 3
迭代4 :插入(4)。溢出异常。堆栈1 - > {3},Stack 2 - > {2,1},top - > 3
迭代5 :删除(2)。
我尝试了最好的水平并且只能说出最坏的时间复杂度,即1+2^1+2^2+..+2^k
(几何级数和)。我不是在寻找最坏的时间复杂性。我甚至无法达到摊销的复杂性。任何人都可以帮助理解如何计算这个问题的摊销复杂性吗?
答案 0 :(得分:0)
最常用的摊销分析工具是"潜在方法",您可以使用维基百科。
但是,我并不擅长编程。让我们来谈谈宗教。我们来谈谈地狱。地狱由k
同心环组成,护城河将环分开。从一个级别到另一个级别穿过护城河的唯一方法是雇用渡船......但是渡轮将需要一枚金币作为回报。当然,在地狱里没有办法获得金子;无论你埋葬什么,这都是你可以花费的东西。(进入地狱的第一环也需要一枚硬币,BTW。)
有趣的是,地狱之戒的规则与你的筹码规则相同。每个戒指的尺寸是之前戒指的两倍(尽量不去考虑它的几何形状),每当戒指满了而有人想进入戒指时,首先有一个戒指必须雇用摆渡者来取走戒指到下一个戒指。
奇怪的是,地狱里只有一个渡船,他的船只坐一个;他神奇地在他被雇用的护城河中实现,并花了一分钟运送雇用他的人。因此,一次只能运送一个人。
这意味着每分钟只有一枚金币在地狱中消耗。这意味着,如果有新人想要进入地狱,并且前几个戒指都满了,那么在渡轮将他带入地狱之前需要花费很多分钟。
现在,地狱空无一人,但在电影中谈话的1023人刚刚去世,所以它即将填满1023人。他们会用1,2,4,8,16,32,64,128,256和512人填满前9个圈子。insert