分治策略——算法


分而治之:据不同的成因选择不同的解决方案。
成语大全如是说。而似乎分治只借了这个成语的名,意思却偏向于问题的拆解再合并,就是把一个复杂的问题分解成多个相同或相似的子问题,再把子问题分解成更小的问题。这种分解问题的思维,。这里先埋一个雷:MapReduce,游鱼过会再提。

从算法开始

No.1 经典排序算法——快速排序

当有人问起:你知道哪几种排序算法啊?大多说人不加思索都能说出三种:冒泡排序(你要是说你只知道选择和插入。。。我估计也不太可能)、选择排序、插入排序。快速排序就是对冒泡排序的一次改进。
冒泡排序是两两比较,当两两不符合当前规定的顺序时,则交换两者的位置。而快速排序就是选定一个基准值,假设从小到大,基准值左边的如果比基准值大就放到右边,基准值左边的如果比基准值小就放到右边,然后在左右两边再循环这个过程。
如下图所示:


快速排序

算法:(备注,相对于图片局部优化了,减少了交换的次数)

#!usr/bin/c++
#include <iostream>
 
using namespace std;
 #需要快排的数组a,数组第一位low,数组最后一位high。
void Qsort(int a[], int low, int high)
{
#初始数组第一位low>=数组最后一位high,说明这一层排序已经到了最小的字元:数组内单个元素。
    if(low >= high)
    {
        return;
    }
    int first = low;
    int last = high;
    int key = a[first];/*用数组的第一个记录作为枢轴*/
 
    while(first < last)
    {
        while(first < last && a[last] >= key)
        {
            --last;
        }
 
        a[first] = a[last];/*将比第一个小的移到低端*/
 
        while(first < last && a[first] <= key)
        {
            ++first;
        }
         
        a[last] = a[first];/*将比第一个大的移到高端*/
    }
    a[first] = key;/*枢轴保存到first处,此时因为first一路走来保证first前面的小于key,last一路走来保证last后面的大于key,且直到最后first遇到了last*/
/*对第一位到枢纽的前一位进行二次快排*/
    Qsort(a, low, first-1);
/*对最后一位到枢纽的后一位进行二次快排*/
    Qsort(a, first+1, high);
}
int main()
{
    int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
    Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);
    for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    {
        cout << a[i] << "";
    }
     
    return 0;
}/*参考数据结构p274(清华大学出版社,严蔚敏)*/

至于对经典快速排序算法的再优化,鱼就不说了,爱看看吧,十分杂乱且刺激。

No.2 经典排序算法——归并排序

快排是分治法从全局有序化(左边小右边大)逐步局部有序化(小的是唯一一个,大的也是唯一一个,那这三个数不就排好序了吗)的排序,归并则是从局部有序化(从两个数开始排好序)逐步全局有序化(全部都排好序)的过程。
因为局部是有序的,所以归并排序是用的以下的手法:


归并排序
#!/usr/bin/python
def MergeSort(lists):
    if len(lists) <= 1:
        return lists
    num = int( len(lists) / 2 )
    left = MergeSort(lists[:num])
    right = MergeSort(lists[num:])
    return Merge(left, right)
def Merge(left,right):
    r, l=0, 0
    result=[]
    while l<len(left) and r<len(right):
        if left[l] < right[r]:
            result.append(left[l])
            l += 1
        else:
            result.append(right[r])
            r += 1
    result += list(left[l:])
    result += list(right[r:])
    return result
print(MergeSort([1, 2, 3, 4, 5, 6, 7, 90, 21, 23, 45]))
#from 百科,不得不说这些写百科的也真的是随手,歪门邪道的错误

经过函数式的洗礼

绝大多数的高级语言都带入了Map(映射)函数、Reduce(归约)函数的理念

#!/usr/bin/js
//array.map(function(currentValue,index,arr), thisValue)
//currentValue=>当前元素的值,index=>当前元素的索引,arr=>当前数组对象,thisValue=>作为执行回调使用
//例子
var numbers = [4, 9, 16, 25];

function myFunction() {
    x = document.getElementById("demo")
    x.innerHTML = numbers.map(Math.sqrt);
}
//from runoob
#!/usr/bin/js
//array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
//比Map多了total作为归并后的返回值。
//例子
var numbers = [65, 44, 12, 4];
 
function getSum(total, num) {
    return total + num;
}
function myFunction(item) {
    document.getElementById("demo").innerHTML = numbers.reduce(getSum);
}
//from runoob

先回到最一开始归并排序的逻辑上去——可以看到MergeSort()是在用递归分解问题,即一个大问题分解成一个小问题。而Merge则是在归并,把有序的小问题合并成一个有序的大问题,因为小问题是有序的,所以排序成本极低(小于n)。由此对比下Map和Reduce的函数逻辑,尽管排序少了对小问题的Map映射处理,也是实现了Reduce的思想进行了归约,假设现在有一个一百万无序的数组,正常的排序算法时间复杂度都在nlgn~n^2之间不定,如果用一台电脑去处理,可能要几个小时的时间。而归并排序在Reduce的过程中成本极低,则可以采用分布式处理的方式,先把问题Map出去,交给服务器集群进行处理,最后再Reduce回来得到最后的结果。
对,就是这样分治策略是分布式系统的逻辑基础,现如今大多数分布式处理都来源于MapReduce思想,由此游鱼还认识了Lisp语言。
在MapReduce里,Map处理的是原始数据,自然是杂乱无章的,每条数据之间互相没有关系;到了Reduce阶段,数据是以key后面跟着若干个value来组织的,这些value有相关性,至少它们都在一个key下面,于是就符合函数式语言里map和reduce的基本思想了。去借用MapReduce模型的话,开发人员只需要考虑如何进行数据处理,提取特征,最后再考虑如何归纳特征。开发人员不用考虑如何并发的问题。


MapReduce

落地到编程模型

分布式存储HDFS——分布式处理MapReduce
这方面鱼推荐大家多去阅读文献,不献丑了。只大概说说,复制一下个人之前Apache Storm的笔记

Apache Storm

一 优势

  • Apache 产品通用优势:可以通过线性增加资源来保持性能
  • 适用性、语言普适性、分布式处理快的优势、操作智能
  • 优秀的防呆措施

二、理念

理念

Input data source: 数据源
Spout: 流的源,通过编写 Spout 以从数据源读取数据
Bolt:逻辑处理单元, Spout 将数据传递到 Bolt 和 Bolt过程,并产生新的数据流。 Bolt 可以拍行过滤、聚合、加入,并与数据 源和数据库进行交互
Tuple:有序元素的列表
Stream:元组的无序序列

关键词:拓扑和路由

三、集群架构

集群架构

Apache Storm 的集群架构,采用了主从设备模式。这种模式参照于?
Zookeeper framework:协助 Supervisor 和 nimbus 交互
Nimbus : Storm 集群的主节点,又称Master。而工作结点分发数据并监控故障
Supervisor:工作节点又称 Workers,负责管理工作进程以完成分配的任务
Worker process:工作进程,其执行与特定拓扑相关的任务。其创建执行器,并要求它们完成任务
Execute:执行器。由工作进程产生的单个线程,用于特定的spout与 bolt
Task:任务,实际执行数据处理。它是个 spout 或 bolt

四、工作流程

工作流程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355