MapReduce矩阵;及快排单链表之解答

开发 前端
今日面试题:一个很大的2D矩阵,如果某点的值,由它周围某些点的值决定,例如下一时刻(i,j) 的值取当前时刻它的8邻点的平均,那么怎么用MapReduce来实现。

今日面试题:

一个很大的2D矩阵,如果某点的值,由它周围某些点的值决定,例如下一时刻(i,j) 的值取当前时刻它的8邻点的平均,那么怎么用MapReduce来实现。

快排单链表分析

题目:

快排(QuickSort)单向链表(Singly Linked List)。

分析:

思路和数据的快速排序一样,都需要找到一个pivot元素、或者节点。然后将数组或者单向链表划分为两个部分,然后递归分别快排。

针对数组进行快排的时候,交换交换不同位置的数值,在分而治之完成之后,数据就是排序好的。那么单向链表是什么样的情况呢?除了交换节点值之外,是否有其他更好的方法呢?可以修改指针,不进行数值交换。这可以获取更高的效率。

在修改指针的过程中,会产生新的头指针以及尾指针,要记录下来。在partition之后,要将小于pivot的的部分、pivot、以及大于pivot的部分重新串起来成为一个singly linked list。

在partition时,我们用最后的节点作为pivot。当我们扫描链表时,如果节点值大于pivot,将节点移到尾部之后;如果节点小于,保持不变。

在递归排序时,我们先调用partition将pivot放到正确的为止并返回pivot,然后,递归左边,递归右边,最后在合成一个单链表。

C++实现:

  1. struct node *partition(struct node *head, struct node *end,   
  2.                       struct node **newHead, struct node **newEnd) 
  3.    struct node *pivot = end; 
  4.    struct node *prev = NULL, *cur = head, *tail = pivot; 
  5.  
  6.    while(cur != pivot) 
  7.    { 
  8.        if(cur->data < pivot->data) 
  9.        { 
  10.           if((*newHead) == NULL) 
  11.                (*newHead) = cur; 
  12.            prev = cur;   
  13.            cur = cur->next; 
  14.        } 
  15.        else 
  16.        { 
  17.            if(prev) 
  18.                prev->next = cur->next; 
  19.            structnode *tmp = cur->next; 
  20.            cur->next = NULL; 
  21.            tail->next = cur; 
  22.            tail = cur; 
  23.            cur = tmp; 
  24.        } 
  25.    } 
  26.    if((*newHead) == NULL) 
  27.        (*newHead) = pivot; 
  28.    (*newEnd) = tail; 
  29.   return pivot; 
  30. struct node *quickSortRecur(struct node *head, struct node *end) 
  31.    if(!head || head == end) 
  32.        return head; 
  33.    node *newHead = NULL, *newEnd = NULL; 
  34.   struct node *pivot = partition(head, end, &newHead, &newEnd); 
  35.    if(newHead != pivot) 
  36.    { 
  37.       struct node *tmp = newHead; 
  38.        while(tmp->next != pivot) 
  39.            tmp = tmp->next; 
  40.        tmp->next = NULL; 
  41.        newHead = quickSortRecur(newHead, tmp); 
  42.        tmp = getTail(newHead); 
  43.        tmp->next =  pivot; 
  44.    } 
  45.    pivot->next = quickSortRecur(pivot->next, newEnd); 
  46.    returnn ewHead; 
  47. void quickSort(struct node **headRef) 
  48.    (*headRef) = quickSortRecur(*headRef, getTail(*headRef)); 
  49.    return

原文链接:http://www.ituring.com.cn/article/49307

责任编辑:陈四芳 来源: 图灵社区
相关推荐

2013-10-16 16:15:26

单链表

2013-10-15 16:27:51

2013-10-16 16:42:19

矩阵

2021-07-13 07:52:03

Python数据结构

2019-10-31 09:52:02

HadoopJava大数据

2012-02-02 10:21:05

单链表nexthead

2014-06-05 08:47:52

Spark 1.0Mapreduce

2022-09-14 15:24:57

typescript快排

2016-10-14 16:52:03

单表关联数据信息

2021-10-13 06:49:15

时间复杂度快排

2022-03-10 17:02:51

Rust单链表数据结构

2009-11-09 10:42:53

ibmdwRational

2014-11-10 15:02:21

大数据云计算Hadoop

2022-02-15 08:25:22

hash表快排二分查找

2009-06-14 22:28:14

ibmdwWebSphere

2009-04-13 11:42:29

IBMdWRational

2010-04-27 18:24:56

Oracle常见问题

2009-07-29 10:03:24

思科网络管理Cisco

2023-03-14 22:32:24

业务单测数量

2011-05-19 16:30:38

软件测试
点赞
收藏

51CTO技术栈公众号