本篇是in place algorithm的学习笔记。目前学习的是in place merge与in place martrix transposition这两个算法。

1.in place merge

论文链接:Practical in-place merging

论文讨论的是如何O(n)时间复杂度,O(1)空间复杂度合并两个相邻的有序数组。

b) 将sublist1与sublist2按sqrt(n)进行block划分, 余下的尾元素移到开头作为buffer( buffer size >= sqrt(n),我们不关注buffer内的元素是否有序 )

c) 选择排序( O(sqrt(n)*sqrt(n)) ), 将各个block排序,使得各个block的末尾元素呈非下降序列。

a) 找到首个block尾元素a[i],使得a[i] > a[i+1],显然之前的满足a[i] <= a[i+1]则之前的已成有序序列。划分好series1和series2.

b) c) 将series1与series2通过buffer进行merge, 直到series1内的元素全部排到正确位置,如c) 所示。

  由于按段尾非下降排序各个block,显然series1会先于series2排完。

a) b) c) 将series2当作series1,series2的下一个block当作series2,重复之前的操作。以上操作的总的时间复杂度尾O(n).

d) sqrt(n) <= buffer size < 2*sqrt(n), 冒泡排序/选择排序,将buffer变为有序序列,时间复杂度O(sqrt(n)*sqrt(n)).

附: 论文中,buffer中的元素是最大的,最后一步操作sort buffer内的元素,即可。

个人想法: 我们需要保证 buffer元素 >= 非buffer元素,否则我们仍然需要insert sort。因此,本人认为在merge前需要进行处理,从sublist1和sublist2中抠出前sqrt(n)大的元素,作为buffer。但这样可能会破坏block,导致某个block元素不够。个人认为可以抠多一点,再补回去。比如先扣除前 3*sqrt(n) 大的元素。这样补回到sublist1,至少还能余下sqrt(n)个元素。

总的时间复杂度为O(n). 可能常数略大。

2.in place matrix transposition

wiki: in place martrix transposition

对于非方阵,进行置换操作。对于一个Circle,记录下初始节点,每次用前驱节点替换当前节点;用初始节点替换最后一个节点。

Non-square matrices: Following the cycles

for each length> cycle C of the permutation
pick a starting address s in C
let D = data at s
let x = predecessor of s in the cycle
while x ≠ s
move data from x to successor of x
let x = predecessor of x
move data from D to successor of s

Improving memory locality at the cost of greater total data movement

reference to wiki

In Place Algorithm的更多相关文章

  1. 挑子学习笔记:两步聚类算法(TwoStep Cluster Algorithm)——改进的BIRCH算法

    转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/twostep_cluster_algorithm.html 两步聚类算法是在SPSS Modeler中使用的 ...

  2. PE Checksum Algorithm的较简实现

    这篇BLOG是我很早以前写的,因为现在搬移到CNBLOGS了,经过整理后重新发出来. 工作之前的几年一直都在搞计算机安全/病毒相关的东西(纯学习,不作恶),其中PE文件格式是必须知识.有些PE文件,比 ...

  3. [异常解决] windows用SSH和linux同步文件&linux开启SSH&ssh client 报 algorithm negotiation failed的解决方法之一

    1.安装.配置与启动 SSH分客户端openssh-client和openssh-server 如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有 ...

  4. [Algorithm] 使用SimHash进行海量文本去重

    在之前的两篇博文分别介绍了常用的hash方法([Data Structure & Algorithm] Hash那点事儿)以及局部敏感hash算法([Algorithm] 局部敏感哈希算法(L ...

  5. Backtracking algorithm: rat in maze

    Sept. 10, 2015 Study again the back tracking algorithm using recursive solution, rat in maze, a clas ...

  6. [Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec词向量模型

    深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展.深度学习一直被人们推崇为一种类似于人脑结构的人工智能算法,那为什么深度学习在语义分析领域仍然没有实质性的进展呢? ...

  7. [Algorithm] 群体智能优化算法之粒子群优化算法

    同进化算法(见博客<[Evolutionary Algorithm] 进化算法简介>,进化算法是受生物进化机制启发而产生的一系列算法)和人工神经网络算法(Neural Networks,简 ...

  8. [Evolutionary Algorithm] 进化算法简介

    进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编 ...

  9. Debian 8 jessie, OpenSSH ssh connection server responded Algorithm negotiation failed

    安装了debian 8.5 就出问题了. root@debian8:~# lsb_release -aNo LSB modules are available.Distributor ID: Debi ...

  10. Using assembly writing algorithm programs

    This's my first version.The logic is simple, just the selection sort. I spent much time learning how ...

随机推荐

  1. Selenium+Python自动化测试学习问题总结笔记

    1.问题描述:不能导入自定义类 错误内容:This inspection detects names that should resolve but don't. Due to dynamic dis ...

  2. numpy技巧

    矩阵旋转: mat_array = np.array([[1,2],[4,3]]) rotate_90 = np.zeros((2,2), np.uint8) rotate_180 = np.zero ...

  3. 为什么使用React Native

    React Native使你能够在Javascript和React的基础上获得完全一致的开发体验,构建世界一流的原生APP. React Native着力于提高多平台开发的开发效率 —— 仅需学习一次 ...

  4. jQuery的基本使用

    一.jQuery简介 jQuery是一个快速.简洁的JavaScript框架,它封装了JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动 ...

  5. Bootstrap学习--基本格式

    以下为Bootstrap的基本格式代码 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta ...

  6. jenkins展示report测试报告的配置

    HTML报告展示 1. 需要HTML Publisher plugin插件 2. 在workspace下的工程(构建)中的目录中存储测试报告 在Jenkins中新建一个job,进入配置项. 首先通过p ...

  7. 部署Maven项目到tomcat报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener【转】

    部署Maven项目到tomcat报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderLi ...

  8. 实验三:敏捷开发与XP实践

    Java实验三报告 一.   实验内容 (一)敏捷开发与XP 内容:1.敏捷开发(Agile Development)是一种以人为核心.迭代.循序渐进的开发方法. 2.极限编程(eXtreme Pro ...

  9. 20135234mqy-——信息安全系统设计基础第六周学习总结

    处理器体系结构 4.1 Y86指令集体系结构 4.1.1程序员可见状态 Y86程序中的每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态. 4.1.2 Y86指令 4个指令:irmovl, ...

  10. 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码

    20172332 2017-2018-2 <程序设计与数据结构>Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...