In Place Algorithm
本篇是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的更多相关文章
- 挑子学习笔记:两步聚类算法(TwoStep Cluster Algorithm)——改进的BIRCH算法
转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/twostep_cluster_algorithm.html 两步聚类算法是在SPSS Modeler中使用的 ...
- PE Checksum Algorithm的较简实现
这篇BLOG是我很早以前写的,因为现在搬移到CNBLOGS了,经过整理后重新发出来. 工作之前的几年一直都在搞计算机安全/病毒相关的东西(纯学习,不作恶),其中PE文件格式是必须知识.有些PE文件,比 ...
- [异常解决] windows用SSH和linux同步文件&linux开启SSH&ssh client 报 algorithm negotiation failed的解决方法之一
1.安装.配置与启动 SSH分客户端openssh-client和openssh-server 如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有 ...
- [Algorithm] 使用SimHash进行海量文本去重
在之前的两篇博文分别介绍了常用的hash方法([Data Structure & Algorithm] Hash那点事儿)以及局部敏感hash算法([Algorithm] 局部敏感哈希算法(L ...
- Backtracking algorithm: rat in maze
Sept. 10, 2015 Study again the back tracking algorithm using recursive solution, rat in maze, a clas ...
- [Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec词向量模型
深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展.深度学习一直被人们推崇为一种类似于人脑结构的人工智能算法,那为什么深度学习在语义分析领域仍然没有实质性的进展呢? ...
- [Algorithm] 群体智能优化算法之粒子群优化算法
同进化算法(见博客<[Evolutionary Algorithm] 进化算法简介>,进化算法是受生物进化机制启发而产生的一系列算法)和人工神经网络算法(Neural Networks,简 ...
- [Evolutionary Algorithm] 进化算法简介
进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编 ...
- 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 ...
- Using assembly writing algorithm programs
This's my first version.The logic is simple, just the selection sort. I spent much time learning how ...
随机推荐
- jenkins 多任务串行执行
摘要 今天在新创建自动化部署项目的时候遇到了一个问题:我们的项目是maven聚合的所以在构建maven项目的时候要从parent开始build,但是这样会造成一个问题,我每次添加此parent项目下的 ...
- 关于matlab向文件写入数据的方法——留着备用
MATLAB数据采集的时候,往往需要把得到的数据保存下来. fid = fopen(文件名,‘打开方式’): 说明:fid用于存储文件句柄值,如果fid>0,这说明文件打开成功.打开方式有如下选 ...
- HPCMS V9使用ajax方式提交表单
一.前台模板(注:需要引入jquery文件) <form id="myform" class="subscribe-form subscription" ...
- MyBatis学习(一)————纯jdbc编程
什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java ...
- Django_缓存
目录 Django缓存的介绍 配置(settings.py设置不同缓存介质) 应用(全局.视图函数.模板) 实测 Django缓存的介绍 除了Django这个web框架之外.其他框架都没有缓存.Dja ...
- eclipse在线安装maven插件
http://blog.csdn.net/xiaoxiaoyeyaya/article/details/17200987 在安装插件的时候将下面的contact all update sites du ...
- 第十一次PSP
- Daily Scrum10 11.14
昨天的任务已经完成,但是我们在完成任务的过程中确实遇到了困难.昨天我们发现无法连接sqlserver的时候,给罗杰老师发了邮件.老师也给我们提出了建议,给我们提供了一些参考.所以今天大家都在研究如何解 ...
- WPF四则运算《《《《《策略模式
设计思路: 因为之前没有用过WPF,听说和window窗体语法类似,就想着仿照之前的Window窗体做的,首先用三个textbox存储数据,添加一个comboBox,利用索引选择运 ...
- JAVA 构造函数 静态变量
class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println(&quo ...