算法
来源:互联网 发布:家电销量数据 编辑:程序博客网 时间:2024/04/30 07:18
1.查找最小的K个元素:利用容器来实现。如果容器中数的个数小于K时,直接插入新数。若容器存满K个数,找出K个数中最大值,当新的数据到来时,比较最大值和新数之间的大小,当新数小于最大值时,删除最大主,并且插入新数。若新数大于最大值,则抛弃新数,直接进行下一个新数的比较。
容器中K个数要找出最大值,用二叉树中的最大堆可以实现。实际中,用红黑树实现容器比较简单。红黑树通过把结点分为红、黑两种颜色并根据一些规则确保树是平衡的,从而保证在红黑树中查找、删除和插入操作都只需要O(logk)。在STL中set和multiset都是基于红黑树实现的。
void FindKLeastNumbers
(
const vector<int>& data, // a vector of data
IntHeap& leastNumbers, // k least numbers, output
unsigned int k
)
{
leastNumbers.clear();
if(k == 0 || data.size() < k)
return;
vector<int>::const_iterator iter = data.begin();
for(; iter != data.end(); ++ iter)
{
// if less than k numbers was inserted into leastNumbers
if((leastNumbers.size()) < k)
leastNumbers.insert(*iter);
// leastNumbers contains k numbers and it's full now
else
{
// first number in leastNumbers is the greatest one
IntHeap::iterator iterFirst = leastNumbers.begin();
// if is less than the previous greatest number
if(*iter < *(leastNumbers.begin()))
{
// replace the previous greatest number
leastNumbers.erase(iterFirst);
leastNumbers.insert(*iter);
}
}
}
}
2.两个栈实现1个队列
template<typename T> class CQueue
{
public:
CQueue(){};
~CQueue(){};
void appendTail(const &node);
void deleteHead();
private:
T->m_stack1;
T->m_statck2;
};
template<typename T> void CQueue<T>::appendTail(const T&element)
{
m_statck1.push(element);
}
template<typename T> void CQueue<T>::deleteHead()
{
if(m_statck2.size<=0)
{
while(m_stack1.size()>0)
{
T &data=m_stack1.pop();
m_stack1.pop();
m_stack.pusj(data);
}
}
assert(m_stack2.size()>0)
m_stack2.pop;
}
3.从尾到投输出链表的节点
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 的好多好多好多废话
- Sqlite数据的制作
- Struts1、Struts2、Hibernate、Spring框架工作原理介绍
- js获得控件位置
- printf函数遵守C调用规范,即参数 从右至左 压栈,堆栈由调用者平衡
- 算法
- Java第六周作业
- Linux tcpdump命令详解
- Server.MapPath - Physical path given, virtual path expected(附源码)
- 关于结构体对齐和结构体位域的问题
- android调用远程service(一个apk调用另一个apk的service)
- [中英对照]Steve Jobs教你做战略
- Android中的线程
- android 检查SD卡是否存在