gap

排序——01

谁说胖子不能爱 提交于 2019-11-28 21:45:35
本文主要内容: 1.插入排序 2.希尔排序 3.直接选择排序 4.堆排序 1.排序:默认情况下为非降序排序 2.稳定性:能够保证排序过程中相同的数据排序前后相对位置不变 3.插入排序:减治算法排序 每次从无序区间选择第一个数插入到有序区间的合适位置(打牌) 时间复杂度:最坏o(n的平方):完全逆序 最好o(n):完全有序[从后往前找] 一般情况:o(n的平方) 越接近有序,执行时间效率越高 空间复杂度:o(1) 稳定性:稳定 计时:long begin = System.naoTime ();long end = System.naoTime (); System.out.println(end-begin); 4.希尔排序(Shell Sort):分组进行插入排序 分组越多:大数据可以很快走到最后,每次分组排序后,数据不太有序 分组越少:每次分组排序后,数据更有序 size = 10;gap = size; gap = gap/3+1;[4,2,1] gap = gap/2;[5,2,1] 前提:利用插入排序中,数据越接近有序,时间效率越高。在插入排序之前做预排序(分组插排),使数据尽可能接近有序。 如何分组:一开始分很多组,越来越少 时间复杂度:最好:o(n) 平均:O(n 1.3,n 1.4) 最坏:O(n^2) 空间复杂度:O(1) 稳定性:不稳定

python实现希尔排序

假装没事ソ 提交于 2019-11-27 02:42:27
python实现希尔排序 希尔排序: 实现分析: 实际上希尔排序就是对插入排序的一种改进而已, 希尔排序是将整个列表当成一个无序序列,并将其分成多个无序序列来进行插入排序,而实现分成多个序列就是需要一个gap步长来实现,对于普通的插入排序gap就是等于1。 我们还是以 __[54,26,93,17,77,31,44,55,20]__为例子。为了分析,我们假设gap先等于2, 图一是我们未划分之前的列表,图二是根据gap划分而来的两个列表,我们需要对每一个列表进行插入排序,排序玩以后得到如下的图 此时步长为2时已经排序完成,现在我们就需要减小步长为1再次进行排序,这时就与普通的插入排序一样了,笔者就不再多说,对于插入排序,可以参考链接: 普通的插入排序实现 . (1)首先我们先把插入排序比较的框架写出来 while i>0: if alist[i]<alist[i-1]: alist[i],alist[i-1]=alist[i-1],alist[i] i-=1 else: break 但是对于希尔排序来说比较的不再是前一个元素,而是以步长来比较的元素,所以这里的1需要改成gap。 (2)对于(1)来说我们仅仅实现了第一步,对于一次进行的排序,而对于一整个序列来说我们需要比较多次,所以我们需要用到一个for循环 for j in range(gap,n ): i=j

知识图谱入门 (六) 知识融合

耗尽温柔 提交于 2019-11-26 20:14:45
欢迎大家关注我的博客 http://pelhans.com/ ,所有文章都会第一时间发布在那里哦~ 本节主要介绍知识融合相关技术,首先介绍了什么是知识融合,其次对知识融合技术的流程做一个介绍并对知识融合常用工具做一个简单介绍。 知识融合简介 知识融合,即合并两个知识图谱(本体),基本的问题都是研究怎样将来自多个来源的关于同一个实体或概念的描述信息融合起来。需要确认的是: 等价实例 等价类/子类 等价属性/子属性 一个例子如上图所示,图中不同颜色的圆圈代表不同的知识图谱来源,其中在dbpedia.org中的Rome 和geoname.org的roma是同一实体,通过两个sameAs链接。不同知识图谱间的实体对齐是KG融合的主要工作。 除了实体对齐外,还有概念层的知识融合、跨语言的知识融合等工作。 这里值得一提的是,在不同文献中,知识融合有不同的叫法,如本体对齐、本体匹配、Record Linkage、Entity Resolution、实体对齐等叫法,但它们的本质工作是一样的。 知识融合的主要技术挑战为两点: 数据质量的挑战: 如命名模糊,数据输入错误、数据丢失、数据格式不一致、缩写等。 数据规模的挑战: 数据量大(并行计算)、数据种类多样性、不再仅仅通过名字匹配、多种关系、更多链接等。 知识融合的基本技术流程 知识融合一般分为两步,本体对齐和实体匹配两种的基本流程相似,如下:

知识图谱入门——知识融合

元气小坏坏 提交于 2019-11-26 20:12:54
文章首发于博客 du_ok’s Notes ,本文链接为 知识图谱入门——知识融合 本文介绍了知识融合相关的技术和典型的知识融合工具。 知识融合相关概念 相关的术语: 知识融合 (Knowledge Fusion) 本体对齐 (Ontology Alignment) 本体匹配 (Ontology Matching) Record Linkage (传统数据库领域) Entity Resolution (传统数据库领域) 实体对齐 (Entity Alignment) 上面的术语的基本问题都是将来自多个来源的关于同一个实体或概念的描述信息融合起来。 本体对齐和本体匹配可认为是等价的,它们包含了概念层的融合 后面三个多指数据层的融合 知识融合目标是融合各个层面(概念层、数据层?)的知识,在合并两个知识图谱(本体)时,需要确认: 等价实例(数据层面) 等价类/子类 等啊几属性/子属性 数据层的融合: 上图是将猫王从YAGO和ElvisPedia进行融合的例子,在 融合最主要的工作是实体的对齐 ,也就是找出等价实例,图中的sameAs就是融合的关键步骤。 知识图谱的构建中经常需要融合多种不同来源的数据: 概念层的融合: 知识融合还包括概念层的融合(包括跨语言的融合:如将中文医疗知识图谱与UMLS融合) 知识在线融合: 知识融合需要: ① 确定哪些会对齐在一起; ②

希尔排序

╄→гoц情女王★ 提交于 2019-11-26 20:07:01
希尔排序是插入排序的一种,也叫做缩减增量排序,是对插入排序的一种优化,但是不稳定。 public class ShellSort { /** *希尔排序,也可以叫做缩减增量排序,不稳定,为了减少比较次数,如插入排序 需要n X n * 原理:通过比较相距一定间隔的元素来工作; * 各躺所用的距离随着算法的进行而减少,知道只比较相邻元素的最后一个排序位置 * * 所间隔的k元素都被排序,相比于插入排序,时间会减少 */ public static void main(String[] args) { int[] a = {77, 12, 88, 42, 7, 22, 78}; sort(a); System.out.println(Arrays.toString(a)); } public static void sort(int[] a) { int j; for(int gap = a.length/2; gap > 0; gap /= 2) { for(int i = gap; i < a.length; i++) { int tmp = a[i]; for(j = i; j >= gap && tmp < a[j-gap]; j -= gap) { a[j] = a[j-gap]; } a[j] = tmp; } } }} 来源: https://www.cnblogs

模板整理: 图论---网络流/最小费用最大流

不羁岁月 提交于 2019-11-26 18:10:55
NOIp……应该不会考这东西吧QAQ 考了感觉药丸。。 还是整一个比较好~ 网络流有个特点就是,最坏的上界一般都是达不到的。 1.FF 思路是每次增广1的流量,很慢的,因为容量一般挺大, 没写过,就没模板了。。O( | f | ∗ m //--> )(似乎是,有点忘了) 2.EK 思路是随意找一条增广路径,然后增广即可。 最坏O( m 2 n //--> )。 就写过一次……还是早期写的……真是有点丑的。。 bool EdKa( int src, int des, int n) { int v,i,head,tail; memset (visit, 0 , sizeof (visit)); head=tail= 0 ; Q[tail++]=src; visit[src]= true ; while (head!=tail) { v=Q[head++]; for (i= 1 ;i<=n;i++) if (!visit[i] && map [v][i]) { Q[tail++]=i; visit[i]= true ; pre[i]=v; if (i==des) return true ; } } return false ; } int maxflow( int src, int des, int n) { int i,_min,sum= 0 ; while ( true ) { if

十大经典排序算法的python实现

我怕爱的太早我们不能终老 提交于 2019-11-26 17:57:12
十种常见排序算法可以分为两大类 :    非线性时间比较类排序 :通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。包括:冒泡排序、选择排序、归并排序、快速排序、插入排序、希尔排序、堆排序等。    线性时间非比较类排序 :不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。包括:计数排序、桶排序、基数排序等。 下面介绍各种算法的基本思想及python实现: 1 冒泡排序(Bubble Sort) 1.1 基本思想:   它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。   1.2 实现代码: 1 def bubbleSort(arr): 2 n = len(arr) 3 for i in range(n-1): 4 for j in range(n-i-1): 5 if arr[j] > arr[j+1]: 6 arr[j], arr[j+1] = arr[j+1], arr[j] 7 return arr 2 选择排序(Selection Sort) 2.1 基本思想:   首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后

MySQL中一条SQL的加锁分析

依然范特西╮ 提交于 2019-11-26 16:26:55
MySQL中一条SQL的加锁分析 id主键 + RC id唯一索引 + RC id非唯一索引 + RC id无索引 + RC id主键 + RR id唯一索引 + RR id非唯一索引 + RR id无索引 + RR Serializable 一条复杂的SQL 死锁原理与分析 SQL1: select * from t1 where id = 10;(不加锁。因为MySQL是使用多版本并发控制的,读不加锁。) SQL2: delete from t1 where id = 10;(需根据多种情况进行分析) 假设t1表上有索引,执行计划一定会选择使用索引进行过滤 (索引扫描),根据以下组合,来进行分析。 组合一 : id列是主键,RC隔离级别 组合二 : id列是二级唯一索引,RC隔离级别 组合三 : id列是二级非唯一索引,RC隔离级别 组合四 : id列上没有索引,RC隔离级别 组合五 : id列是主键,RR隔离级别 组合六 : id列是二级唯一索引,RR隔离级别 组合七 : id列是二级非唯一索引,RR隔离级别 组合八 : id列上没有索引,RR隔离级别 组合九 : Serializable隔离级别 注:在前面八种组合下,也就是RC,RR隔离级别下,SQL1:select操作均不加锁,采用的是快照读,因此在下面的讨论中就忽略了,主要讨论SQL2:delete操作的加锁。 1.

希尔排序

流过昼夜 提交于 2019-11-26 15:52:55
希尔排序 不断缩小增量的插入排序 原理 以某个增量h为步长跳跃分组进行插入排序,增量是一个从h逐渐缩小至1的过程,所以又称缩小增量排序。 其核心在于间隔序列设定,是与插入排序的本质区别。插入排序始终增量为1。 最佳增量: k趟排序增量步长为(2^k)-1,即增量序列(2^k)-1,…15,7,3,1 分析 时间复杂度:nlogn 代码 void shellsort(int a[],int len){ int gap = len; while(gap = gap/2){//增量 for(int i=gap;i<len;i++){//下面的就是插入排序,间距为gap int key=a[i]; int j=i-gap; while(j>=0 && a[j]>key){ a[j+gap] = a[j]; j-=gap; } a[j+gap] = key; } } } 来源: https://www.cnblogs.com/pacino12134/p/11325068.html

算法之排序

邮差的信 提交于 2019-11-26 14:44:10
1. 时间复杂度就是while的次数,二分查找O(h)=O(log2n) 2. 冒泡排序(O(n^2) 、稳定) 它重复地走访过要排序的数列,依次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 function bubbleSort(arr){ const len = arr.length; for (let i = 0; i < len; i++ ){ for (let j = 0; j < len - 1 - i; j++ ){ if (arr[j] > arr[j + 1 ]){ [arr[j], arr[j +1]] = [arr[j+1 ], arr[j]]; } } } return arr; } 3. 快排(O(nlogn)) 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 var quickSort = function (arr){ if (arr.length <= 1) { return arr;} const midIndex = Math.floor(arr.length / 2 ); const mid = arr