Latest Posts

Python 多线程/异步编程例子 | Multithread / asynchronous programming examples in Python

Python也是可以多线程/异步编程的。异步有什么用呢?一个经典的思维模型如下:一个程序需要到不同的服务器上去取数据,需要等各种数据收集齐了,才能继续下一步。假如有10个服务器,如果是单前程,那么只能发出一个请求,然后等待服务器返回,然后再发一下个请求。这样每个时刻只有一个服务器在工作而其他9个都是闲置的。更高效的方法是同事向10个服务器发送请求,然后马上拿到个“收据”,注意拿到收据只是说已经提交到服务器了,不代表已经完成请求。这个“收据”就叫future。请求全部提交完了,那么主程序就可以等着全部服务器完成请求。 以下是个具体的例子,用Python 2.7实现

Python与股票分析

偶尔发现这个github网站收集各种语言的关于股票的工具,值得收藏一下https://github.com/wilsonfreitas/awesome-quant 准备照着这个列表练练手,熟悉一下各种工具。 首先试试拿数据的库,以下是几年没更新,已经不能用的 googlefinance,,yahoo-finance

算法练习 kth smallest element in BST with known subtree size,在已知子树大小的二叉搜索树里找第k小的元素

最简单暴力的就是直接dfs做in order traversal,记录现在是第几个元素,当等于k时就返回。这样时间复杂度是O(N),空间O(logN)。但是这样就没有利用到子树大小已知的属性。 最优解法是利用子树大小信息推出当前节点的index,如果比k大,那么目标在当前节点左边,如果比k小则在当前节点右边,如果等于k,就找到了。这样可以把时间减到O(logN),空间则是O(1),优于暴力解法不少。 推出当前节点的index,可以用一个变量记录range,也就是子树可能的最小和最大index。 一道挺有意思的题目。 Python # 50 (10) # / \ # 30 (4) 70 (5) # / \ / \ # 20 (2) 40 (1) 60 (3) 80 (1) # / / \ # 5 (1) 55…
Read more

利用统计节省病毒试纸的方法

病毒流行,试纸短缺。网上偶尔看到的,把5个病人的血液混合一起测,如果是阴性,皆大欢喜。如果不幸是阳性,再重新对每人单独测试。为什么这样能节省试纸呢?以下计算一下所用试纸的期望。 假设感染人数占20%,那么没被感染概率是80%。连测5个全部健康的概率是0.8^5 = 32.8%。那么非5个全健康的概率是67.2%。5个混合测出阴性用一个试纸,阳性呢,除了已经用了的一张试纸外,还需要对5人重新测,所以需要6张。 那么试纸数的数学期望是 1*0.328 + 6*0.672 = 4.36 < 5 !

算法练习 Leetcode 力扣 69. Sqrt(x) Python, Java, C++, Scala 解法

这题是经典算法二分查找(binary search)的应用。做题之前先复习binary search的经典实现,注意几个细节。但是和一般binary search不同,这题不是找一个特定的数,而是要找到一个整数正好是sqrt(x)的整数部分,而又不能直接求出sqrt(x)。我想了一下,可以表达成从[0, x]中找出一个整数,这个整数ans满足ans^2 <= x,而同时(ans + 1)^2 > x。 Python实现 Scala 实现1 使用while loop,思路比较像Java 和 Python 不一样的是,Scala Int 平方后会溢出,而float精度不够,必须用double才能过OJ。用Long(64位)也可以。 Scala 实现2 使用recursion代替while loop,平方用Long表示 Scala 实现3 使用recursion代替while loop,平方用Double表示 时间上好像没差太多,半斤八两。

怎样在 Mac OS X 上干净安装 Scala?(不用homebrew)

非Brew方式,干净安装。 到Scala官网下载页面 https://www.scala-lang.org/download/ 下载 Mac OS X 那个,解压,放在任意喜欢的路径,比如home里 然后修改 ~/.zprofile 文件。(如果是bash就修改 ~/.bash_profile),如下修改,记得把<user>替换成自己的user name source ~/.zprofile 或者 打开一个新的terminal就可以用 scala REPL 或者 scalac 了。

算法练习 Leetcode 力扣 1145. Binary Tree Coloring Game 解法

这题描述巨长无比,可以当一篇阅读理解来做了,看完也不是很容易就能想到是属于哪类的题目,图也画的非常有迷惑性,蓝色应该画在1位置能多占一个。热爱做脑筋急转弯的同学可以挑战一下,没时间的同学就直接记住结论就好,蓝色的可能选择其实只有3个:红色的左边,右边,和上面,分别切断和占领左右上三部分,然后看看每部分能不能超过一半就好。有了这个思路,用DFS跑一次就行,时间是O(n),没有explicit extra space,但算上DFS递归占用stack也是O(n) Python 实现 还有一种写法,可以把查找和算子树节点个数合并成一个DFS,trick就是用一个container参数记录当找到x时,他的左中上能控制的节点树,其他部分就是正常的DFS。能缩短代码。 Python 实现 Java 实现 Scala 实现 Scala和Java基本一样,就是注意没有return statement,最后一个表达式就是return值。还有定义函数记得要加 =