Algorithms 算法学习笔记20180415

今天主要的学习内容是决策树与随机排序算法。

先说一下决策树,决策树与我们在进行目标客户推销的过程是类似的,场景是在某数码产品商场中,我们通过了解客户的需求,比如身份,所需产品大类,心理价位,使用场景等来逐步缩小可推销的产品种类,这就是一步步决策的过程,每一次决策只有Yes和No两种结果。当然,这些决策既有定性的,也有定量的。

决策树中含有3种节点,根节点,枝节点和叶节点。从根节点向下按判定条件的结果不同,拆分为枝节点,然后再层层拆分,最后到叶节点,是已经完成了所有情况和结果的分析。因为,它画出来的是一张树形图。而换一种方式来理解的话,决策树的全部对应了一个问题的所有情况的讨论和分类,决策树的自上而下的过程就是一个分类器根据既有信息进行最终分类判定的过程。翻译成Java语言就是不断地If...else语句。

给出一张决策树示例图如下:

Algorithms 算法学习笔记20180415_第1张图片
Descision Tree

接下来讲随机排序算法,随机排序是排序算法的一种,它的方式是主元不再是默认为序列的第一个元素,而是随机的一个元素,随机性由Java中的Math.Random方法实现,为了计算采用首元素和采用随机元素作为主元有什么差别?我们需要根据所有可能的输入计算一下算法所用时间的期望值。

举例说明:

1.帽子的保管,假设n个人各有一顶帽子,所有人把帽子放下,然后由服务人员随机把帽子还给他们,那么每个人拿的是自己的帽子的期望有多少?

以等概率考虑的话,每个人拿到的是自己帽子的概率是1/n,根据期望的定义,E(x)=1/n*n=1

2.逆序对,逆序对的定义是,在某一个序列中,当ia[j],问存在逆序对的期望是多少?这里只考虑单一情况,一个序对要么是,要么不是,因此概率是1/2,从n个元素中挑选2个,其有C(2,n)中方式,故E(x)=C(2,n)*1/2=n(n-1)/2*1/2=n(n-1)/4

这里我们可以总结出来,把一个随机变量视为一个具体事件,单独求每个事件的期望,然后把每个事件的期望相加,得到总的期望。这与算法的分治思想(Divide and Conque)是类似的。


随机排序,也可以称之为洗牌算法,这里举例为原序列为1,2,3,4,5,6,7,8,9,10,我们要把它打乱。洗牌算法的操作方式是:

1.选择一个随机元素(由Math.Random生成),假定为4

2.将最后一个元素与4交换

3.从后往前遍历,改为倒数第二个元素,再选择一个随机元素,假定为2,然后将倒数第二个元素与2交换。

4.直到所有元素完成交换。

其代码实现过程也较为简单,如下:

Algorithms 算法学习笔记20180415_第2张图片
随机算法

那么如何验证这种随机排列的随机性呢?我们可以将这种算法执行足够多次,比如10万次,然后将10万组排列的相同位置的元素进行相加,则总值应该是差异不大的。

你可能感兴趣的:(Algorithms 算法学习笔记20180415)