大量数据取k个最大值并排序

需求是这样的,我们都知道,在信息检索中,经常要取top-k(一共k,而不是第k)个得分最大的文档,并且从大到小排序。

而且文档规模很大,最少也要上千万。

话说这是一道很可以拿来面试的题啊。

我们不考虑Hadoop神马的,就说说单机怎么搞。

最傻的做法就是把1000万个都存储下来,然后sort,然后取min(k, vec.size())。

这样有两个缺点:
1、内存占用非常大,其实我们只要保留最大的1000个,但这样就要保存N个。在1000万的测试中,它要占用68M[......]

继续阅读

这就是理论有余,实践不足么?

今天看到一个问题,两个线程,轮流交替输出1,2,1,2。。。

看似很简单是吧,就是条件控制么,果断最简单的wait和notify,但是一致报IllegalMonitorStateException,各种囧啊,各种试。最后发现是obj.wait()和obj.notify()必须放在synchronized块内。。之前真的真的从来没注意过这个细节。。。
public class TestPrint {

public static void main(String[] args) th[......]

继续阅读

Java核心技术卷II(第8版) – 读书笔记 – 第4章

本章主要记录Java操作数据库

1、JDBC是Java操作数据库的接口,现在的版本已经是JDBC 4了。

2、JDBC的设计理念就是提供一套基本统一,纯Java的API数据库访问接口。JDBC实际是驱动管理器,各个厂家提供JDBC规范的驱动,注册到管理器中。这样,开发者使用JDBC API,而数据库厂商使用JDBC驱动API。

3、JDBC驱动的分类:
(1)JDBC/ODBC桥:将JDBC翻译成ODBC,然后实际调用ODBC来完成数据库操作。
(2)JDBC+本地代码:用[......]

继续阅读

Java核心技术卷II(第8版) – 读书笔记 – 第3章

本章是重头戏:网络编程!

1、首先测试一下daytime服务:
telnet time.nist.gov 13

Trying 192.43.244.18...
Connected to ntp.glb.nist.gov.
Escape character is '^]'.

55965 12-02-08 12:34:39 00 0 0 612.3 UTC(NIST) *
Connection closed by foreign host.
这个过程中[......]

继续阅读