Mathematica中的列表(List)

 PUBLISHED ON February 12, 2015

List是Mathematica中的一种重要的数据结构。

** 在Mathematica中使用List时必须注意:Mathematica的List的索引是从1开始的,不是0! **

List的表示

List用{}来表示。如:

{1, 2, 3, 4}

List的生成

Mathematica中,有以下三种方式来生成List。

  1. Range 命令
Range[Subscript[i, max]] 
    生成列表 {1,2,\[Ellipsis],Subscript[i, max]}.
Range[Subscript[i, min],Subscript[i, max]] 
    生成列表 {Subscript[i, min],\[Ellipsis],Subscript[i, max]}.
Range[Subscript[i, min],Subscript[i, max],di] 
    使用步长 di 生成列表. 


Dive Into Haskell(2) 数据类型和类型类(Typeclasses)

 PUBLISHED ON February 11, 2015

静态类型

Haskell是静态类型(Static Type)语言,在编译时期每个表达式的类型都已经确定下来。如果在代码中有类型错误,就不可能通过编译。这极大地提高了代码的安全性。在Haskell中,所有东西都有类型。

GHCi中查看数据类型

在GHCi中,通过 :t <name> 或者 :type <name>来查看变量、常量或表达式的数据类型。例如:

Prelude> let a = 1
Prelude> :t a
a :: Num a => a
Prelude> :type True
True :: Bool
Prelude> :t 4 == 5
4 == 5 :: Bool

基本数据类型

Haskell有以下几种基本数据类型:


背包问题总结

 PUBLISHED ON February 11, 2015

背包问题是动态规划思想和方法的经典应用问题,本文将从0-1背包,完全背包和混合背包三个角度来分析简单背包问题的求解方法。

背包问题

背包问题本质上是规划型问题,问题的核心在于在满足约束条件下,找到一种选择方案,使得目标值达到最优。通过动态规划的方法,可以将此类问题限制在多项式复杂度的时间内求解。


Java JNI 初探

 PUBLISHED ON February 10, 2015

什么是 JNI ?

JNI(Java Native Interface),Java 本地接口,是一个本机编程接口,提供了Java与C,C++语言的通信。JNI的主要实现方式为在Java中通过System.loadLibrary来加载C/C++编写的DLL。以此来调用C/C++实现的函数。

Java调用C++

Java语言的写法:

package com.dhdave.maker;

/**
 * @author DHDave
 * 
 */
public class Maker {

    static {
        System.loadLibrary("Maker");
    }

    @SuppressWarnings("javadoc")
    public native int DisplayMakerInfo(String info);

    @SuppressWarnings("javadoc")
    public static void main(String[] args) {
        int length = (new Maker()).DisplayMakerInfo("Hello Maker JNI !");
        System.out.println(length);
    }
}

native关键字定义的方法用C/C++实现。


Python 的默认参数

 PUBLISHED ON February 10, 2015

Python的默认参数为编程带来了极大地便利,但同时误用默认参数也产生了不小的陷进。

默认参数的求值

在Python(34)的Documentation中,有这样一段叙述:

Default parameter values are evaluated from left to right when the function definition is executed.

Python的默认参数是从左向右求值。看下面这段代码:

param = [1, 3, 2, 4]

def func(a=param.copy(), b=param.sort(), c=param.copy()):
    print(a, b, c)

if __name__ == '__main__':
    func()


寻找第K大的数

 PUBLISHED ON February 09, 2015

一、概述

朴素的寻找第k大元可以排序,再找到第k个,时间复杂度为O(n * log(n)),但由于只需要第k大,因此这样会造成很大的时间上浪费。维护一个k大的堆的时间复杂度为O(n * log(k)),有所改进,但时间复杂度仍不够优,且实现复杂。而基于分治思想的算法可以在O(n)的时间内找到第k大的数。

二、原理


巧用异或(XOR)运算

 PUBLISHED ON February 09, 2015

异或(Exclusive or, XOR)是一种逻辑运算,在一些情境下,巧用异或运算能够很高效地解决问题。

异或运算的定义

异或运算的符号是^,其定义如下:

a xor b = (a & ^b) | (^a & b)

真值表:

a b a xor b
0 0 0
0 1 1
1 0 1
1 1 0


Sleep Sort

 PUBLISHED ON February 08, 2015

Sleep Sort 是一种通过多线程的不同休眠时间的排序方法。可以很简单地用Shell脚本实现。

#! /bin/bash

function func() {
    sleep "$1"
    echo "$1"
}

while [ -n "$1" ]
do
    func "$1" &
    shift
done
wait


K-近邻算法(KNN)

 PUBLISHED ON February 08, 2015

K-近邻算法(KNN, K Nearest Neighbors)是最基本、最简单、最有效的分类算法之一。KNN算法精度高、对异常值不敏感,可以有效地处理数据缺失的情况,但同时,KNN算法的计算时间复杂度和空间复杂度都很高,特别是运行时需要载入全部数据,会占用很大的内存空间。

KNN算法的基本原理:输入未分类的(没有标签的)新数据时,将新数据的每个特征与样本集中的数据所对应的特征进行比较,然后提取出最相似的分类,作为新数据的分类。一般来说,选取样本集中最相似的前$k$个元素作为分类标准。通常来说,$k$的值不大于20,选择这$k$个最相似元素中出现次数最多的分类作为新数据的分类。


Python PEP 8 简单汇总

 PUBLISHED ON February 07, 2015

PEP 8 是Python的代码风格指南(Style Guide for Python Code),其中很多内容都来自Guido van Rossum。PEP 8 从代码格式、注释、空白、变量名、参考及权利声明等方面出发,主要提到了以下这些关于Python代码风格的问题。

代码格式(Code lay-out)

缩进(Indentation)

每一级缩进使用4个空格。当一行过长需要折行时,应该保持与换行的界定符的垂直对齐。如下例:

# Aligned with opening delimiter.
foo = long_function_name(var_one, var_two,
                     var_three, var_four)

或者下一行采用8个空格的缩进,与其他的正常缩进区别开来,例如: