Cousera 《Algorithms I》课程作业,对优先队列的应用的几个小问题。
本文参考keyvanakbary,ForeseeMark,zerods-seu的成果
- 8 puzzle
- Dynamic Median
- RandomizedPQ
- Taxicab
1、8 puzzle
类似于华容道,A*算法的应用,对于 Dijstra 来说省略无用的路径,更加高效。
由两个类构成 Board() & Soler(), 相当于以版做单位, 移动之后的状态作为新的 Board,存储于优先队列中。
1 | import java.util.LinkedList; |
2、Dynamic Medianjjjoo,
找到一组数的中位数
(1)增加一个元素,时间 O(log(n))时间
(2)返回当前元素集合的中位数,O(n)时间。
(3)删除中位数,log(n)时间。
1 | import edu.princeton.cs.algs4.MaxPQ; |
3、RandomizedPQ
具体和课程中给出的优先队列并无二致,加入 delRandom()随机删除一个元素,和删除堆顶元素类似
1 | public Key delRandom() { |
4、Taxicab
Taxicab numbers. A taxicab number is an integer that can be expressed as the sum of two cubes of integers in two different ways: a3+b3=c3+d3. For example, 1729=93+103=13+123. Design an algorithm to find all taxicab numbers with a, b, c, and d less than n.
Version 1: Use time proportional to n2logn and space proportional to n2.
Version 2: Use time proportional to n2logn and space proportional to n.
zerods-seu的文章中写到:先计算出所有小于 n1/3 +1 的整数的 3 次方,放在数组 cube[]里面,然后循环,从余下项目中二分法查找(obj-num2), 如果找到了 count++,最后如果 count 等于 2, 那么既满足要求。复杂度是$n4/3logn 的,空间复杂度是 n1/3+1。
1 |
|