桟的min实现:O(1)时间复杂度
2014-12-01 22:53
106 查看
实现桟的push和pop操作,以及桟的min操作返回桟中的最小值,要求这三个操作的时间复杂度均为O(1)。
在Java中可以使用LinkedList实现桟的各种操作,这里使用双向链表实现桟的push和pop操作,这两个操作都能维持O(1)的时间复杂度,但是对于求桟中元素的最小值,最容易想到的方法是遍历整个桟,然后返回,但此时的时间复杂度为O(n),要想省下时间复杂度,则必须牺牲空间复杂度,所以可以再维护一个和桟大小相同的数据结构(可以是链表,动态数组或者一个新的桟)来存储每个元素入桟之后对应的桟中的最小元素,在对桟执行push和pop操作时,这个数据结构也跟着变化,这样就能以O(1)的时间复杂度实现min操作了。
上面main函数的输出为:
在Java中可以使用LinkedList实现桟的各种操作,这里使用双向链表实现桟的push和pop操作,这两个操作都能维持O(1)的时间复杂度,但是对于求桟中元素的最小值,最容易想到的方法是遍历整个桟,然后返回,但此时的时间复杂度为O(n),要想省下时间复杂度,则必须牺牲空间复杂度,所以可以再维护一个和桟大小相同的数据结构(可以是链表,动态数组或者一个新的桟)来存储每个元素入桟之后对应的桟中的最小元素,在对桟执行push和pop操作时,这个数据结构也跟着变化,这样就能以O(1)的时间复杂度实现min操作了。
public class Stack1<Key extends Comparable<Key>> { private Node top; private Node minTop; private class Node { Key key; Node next; Node prev; Node(Key key, Node next, Node prev) { this.key = key; this.next = next; this.prev = prev; } } /* 元素入桟,因为要求桟的push,pop以及min操作都为O(1)操作,所以 * 在元素入桟时还要维护一个min桟 */ public void push(Key key) { if (top == null) { top = new Node(key, null, null); top.next = null; top.prev = null; pushMin(key); return; } Node x = new Node(key, null, top); top.next = x; top = x; pushMin(key); } /* 维护一个最小元素的桟 */ private void pushMin(Key key) { if (minTop == null) { minTop = new Node(key, null, null); minTop.next = null; return; } if (key.compareTo(minTop.key) < 0) { Node x = new Node(key, null, minTop); minTop.next = x; minTop = x; } else { Node x = new Node(minTop.key, null, minTop); minTop.next = x; minTop = x; } } /* 元素出桟,因为要求桟的push,pop以及min操作都为O(1)操作,所以 * 在元素入桟时还要维护一个min桟 */ public Key pop() { if (top == null) { return null; } Key key = top.key; if ((top.prev == null) && (top.next == null)) { top = null; popMin(); return key; } top = top.prev; top.next = null; popMin(); return key; } /* 返回桟中的最小元素 */ private Key popMin() { if (minTop == null) { return null; } Key key = minTop.key; if ((minTop.prev == null) && (minTop.next == null)) { minTop = null; return key; } minTop = minTop.prev; minTop.next = null; return minTop.key; } /* 返回桟的最小元素 */ public Key min() { /* 注意边界条件,当维护的桟为空时minTop也为空 */ if (minTop == null) { return null; } return minTop.key; } public static void main(String[] args) { Stack1<Integer> stack1 = new Stack1<Integer>(); stack1.push(11); stack1.push(23); stack1.push(4); stack1.push(76); stack1.push(13); stack1.push(42); System.out.println(stack1.min() + " " + stack1.pop()); System.out.println(stack1.min() + " " + stack1.pop()); System.out.println(stack1.min() + " " + stack1.pop()); System.out.println(stack1.min() + " " + stack1.pop()); System.out.println(stack1.min() + " " + stack1.pop()); System.out.println(stack1.min() + " " + stack1.pop()); System.out.println(stack1.min() + " " + stack1.pop()); } }
上面main函数的输出为:
4 42 4 13 4 76 4 4 11 23 11 11 null null
相关文章推荐
- 实现时间复杂度为O(1)的Push,Pop,Min
- 定义栈的数据结构在Theta(1)时间复杂度内实现min,pop,push操作
- 实现一个栈,要求push,pop,Min的操作时间复杂度为O(1)
- 定义一个栈的数据结构,实现min函数,要求push,pop,min时间复杂度是0(1);找出字符串中的最长子串,要求子串不含重复字符,时间复杂度是O(n);
- 实现一个栈,要求pop,push,Min,时间复杂度为O(1)
- 设计栈,在O(1)的时间复杂内实现push,pop,min
- 定义一个栈的数据结构,实现min函数,要求push,pop,min时间复杂度是0(1);找出字符串中的最长子串,要求子串不含重复字符,时间复杂度是O(n);
- 实现一个栈的pop,push,Min(最小值),时间复杂度为O(1)
- 用bitmap的方法实现排序,时间复杂度为O(n),C实现
- 插入排序 和 归并排序(分治)的c实现和时间复杂度分析
- 斐波那契数列算法的三种C#实现及时间复杂度分析
- 最长递增子序列优化算法(时间复杂度为nlgn)C++实现
- 实现一个栈,获取其中最大元素,获取时间复杂度为O(1)
- 在时间复杂度O(n)内,实现将数组A[n]中所有元素左循环移n位
- 二分法实现插入排序,时间复杂度O(nlgn),算法导论练习2.3,linux纯C实现
- 任意半径中值滤波(扩展至百分比滤波器)O(1)时间复杂度算法的原理、实现及效果。
- 实现pop push min操作时间复杂度为O(1)的栈结构
- 练习系列 - 3、设计包含min函数的栈,push、pop、min的时间复杂度都为O(1),仿照APR_RING采用宏实现
- 每对顶点间的最短路径算法时间复杂度改进C++实现
- 【转】腾讯微信面试题--实现时间复杂度为O(1)的栈 2013-02-26