精华内容
下载资源
问答
  • 依赖关系算法

    千次阅读 2012-06-07 14:06:53
    关系依赖算法 一、引言 昨天,因为工作需要,在处理对多个表同时插入时,表与表之间存在依赖关系(即存在外键引用),需要有一个算法对所有相关表进行重新排序,将没有依赖的表先插入,有依赖的表在它所依赖...

     关系依赖算法



    一、引言

    昨天,因为工作需要,在处理对多个表同时插入时,表与表之间存在依赖关系(即存在外键引用),需要有一个算法对所有相关表进行重新排序,将没有依赖的表先插入,有依赖的表在它所依赖表插入之后,在进行插入操作。引申到生活中,我们平时同样会遇到或多或少的很多事情,它们之前同样存在着千丝万缕的依赖关联。这时候我们同样需要将所有的事情排一下顺序,确定自己是先做什么,后做什么。

    二、场景

    现在摆在我们面前有几件事情,ABCDEFG,当然,D必须在A完成之后做,我们把这种关系定义为“依赖”,用符号“A-->D”标识,表示事情D是依赖事情A的,这样,它们的关系如下图所示:



    三、算法步骤

    1、我们确定所有事情清单(简称T),并画出如上类似的关联图形。

    事情清单:T(A,B,C,D,E,F,G)

    2、列出所有依赖关系清单(简称R)。

    依赖关系清单R:左右两边分别标记为RL关系清单和RR关系清单。
    A-->G
    A-->D
    A-->G
    B-->C
    D-->B
    D-->E
    F-->E
    G-->F
    B-->G

    3、开始运算。

    约定左边为依赖关系清单R,右边为事情清单,分隔符号“|” 前边的事情表示已经排好,后边是等待排的事情。

    第一步:开始时,分隔符号在事情清单开始,表示所有事情均等待排序。将等待排序的清单中划掉RR关系清单中出现过的事情,将未划掉的放到分隔符前边,然后从依赖关系清单中同时划掉分隔符前边出现过的关系对,得到第二步,此时事情A已经排好。

     

    第二步:重复第一步,得到第三步,此时事情AD已经排好。

     

    第三步:重复第一步,得到第四步,此时事情ADB已经排好。

     

    第四步:重复第一步,得到第五步,此时事情ADBCG已经排好。

     

    第五步:重复第一步,得到第六步,此时事情ADBCGF已经排好。

     

    第六步:重复第一步,得到第七步,此时事情ADBCGFE已经排好。

     

    第七步:完成。最终事情的执行顺序序列为ADBCGFE,当然这也不是唯一的答案,从第五步我们可以看出,CG是可以互换的,所以ADBGCFE也是最终答案。

     

    四、结论

    通过这样一个算法,我们就把事情ABCDEFG都打理清楚了,接下来我们需要做的,就是按照最终执行序列着手去做了。这里就不提供代码实现了,重要的是思想与执行力。


    五、注意

     

    当然,该方法是有前提条件的,各个事情之间不能存在两两相互依赖,此时是无解的。例如,场景中A-->C改成C-->A,则存在C-->A-->D-->B-->C,无解。

     


    godway
    com.gaowei@msn.com
    2012-06-07

    展开全文
  • 判断点与多边形位置关系算法

    千次阅读 2012-03-15 23:30:01
    判断点与多边形位置关系算法  ---by wangsh    目前,判断点与多边形位置关系算法多是采用射线法,判断射线与多边形交点的个数的奇偶性。在处理简单多边形方面,算法性能良好,但是对处理复杂多边形等不是很...

                 判断点与多边形位置关系算法

                                  ---by  wangsh

     

               目前,判断点与多边形位置关系算法多是采用射线法,判断射线与多边形交点的个数的奇偶性。在处理简单多边形方面,算法性能良好,但是对处理复杂多边形等不是很理想。

    展开全文
  • 大多数据结构课本中,串涉及的内容即串的模式匹配,需要掌握的是朴素算法、KMP算法及next值的求法。在考研备考中,参考严奶奶的教材,我也是在关于求next值的算法中卡了一下午时间,感觉挺有意思的,把一些思考的...

    大多数据结构课本中,串涉及的内容即串的模式匹配,需要掌握的是朴素算法、KMP算法及next值的求法。在考研备考中,参考严奶奶的教材,我也是在关于求next值的算法中卡了一下午时间,感觉挺有意思的,把一些思考的结果整理出来,与大家一起探讨。

    本文的逻辑顺序为
    1、最基本的朴素算法
    2、优化的KMP算法
    3、应算法需要定义的next值
    4、手动写出较短串的next值的方法
    5、最难理解的、足足有5行的代码的求next值的算法
    所有铺垫为了最后的第5点,我觉得以这个逻辑下来,由果索因还是相对好理解的,下面写的很通俗,略显不专业…

    一、问题描述

    给定一个主串S及一个模式串P,判断模式串是否为主串的子串;若是,返回匹配的第一个元素的位置(序号从1开始),否则返回0;如S=“abcd”,P=“bcd”,则返回2;S=“abcd”,P=“acb”,返回0。

    二、朴素算法

    最简单的方法及一次遍历S与P。以S=“abcabaaaabaaacac”,P="abaabcac"为例,一张动图模拟朴素算法:

    在这里插入图片描述
    这个算法简单,不多说,附上代码

    #include<stdio.h>
    int Index_1(char s[],int sLen,char p[],int pLen){//s为主串,sLen为主串元素个数,p为模式串,pLen为模式串的个数
        if(sLen<pLen)return 0;
        int i = 1,j = 1;
        while(i<=sLen && j<=pLen){
            if(s[i]==p[j]){i++;j++;}
            else{
                i = i-j+2;
                j = 1;
            }
        }
        if(j>pLen) return i-pLen;
        return 0;
    }
    void main(){
        char s[]={' ','a','b','c','a','b','a','a','a','a','b','a','a','b','c','a','c'};//从序号1开始存
        char p[]={' ','a','b','a','a','b','c','a','c'};
        int sLen = sizeof(s)/sizeof(char)-1;
        int pLen = sizeof(p)/sizeof(char)-1;
        printf("%d",Index_1(s,sLen,p,pLen));
    }
    

    三、改进的算法——KMP算法

    朴素算法理解简单,但两个串都有依次遍历,时间复杂度为O(n*m),效率不高。由此有了KMP算法。
    一般的,在一次匹配中,我们是不知道主串的内容的,而模式串是我们自己定义的。
    朴素算法中,P的第j位失配,默认的把P串后移一位。
    但在前一轮的比较中,我们已经知道了P的前(j-1)位与S中间对应的某(j-1)个元素已经匹配成功了。这就意味着,在一轮的尝试匹配中,我们get到了主串的部分内容,我们能否利用这些内容,让P多移几位(我认为这就是KMP算法最根本的东西),减少遍历的趟数呢?答案是肯定的。再看下面改进后的动图:
    在这里插入图片描述

    这个模拟过程即KMP算法,若没有看明白,继续往下看相应的解释,理解需要把P多移几位,然后回头再看一遍这个图就很明了了。

    相比朴素算法:
    朴素算法: 每次失配,S串的索引i定位的本次尝试匹配的第一个字符的后一个。P串的索引j定位到1;T(n)=O(n*m)
    KMP算法: 每次失配,S串的索引i不动,P串的索引j定位到某个数。T(n)=O(n+m),时间效率明显提高

    而这“定位到某个数”,这个数就是接下来引入的next值。(实际上也就是P往后移多少位,换一种说法罢了:从上图中也可以看出,失配时固定i不变,令S[i]与P[某个数]对齐,实际上是P右移几位的另一种表达,只有为什么这么表达,当然是因为程序好写。)

    开——始——划——重——点!(图对逻辑关系比较好理解,但i和j的关系对后面求next的算法好理解!)

    • 比如,Pj处失配,绿色的是Pj,则我们可以确定P1…Pj-1是与Si…Si+j-2相对应的位置一一相等的
      在这里插入图片描述

    • 假设P1…Pj-1中,P1…Pk-1与Pj-k+1…Pj-1是一一相等的,为了下面说的清楚,我们把这种关系叫做“首尾重合”
      在这里插入图片描述

    • 那么可以推出,P1…Pk-1与Si…Si+j-2
      在这里插入图片描述

    • 显然,接下来要做的就是把模式串右移了,移到哪里就不用多说了:
      在这里插入图片描述

    • 为了表示下一轮比较j定位的地方,我们将其定义为next[j],next[j]就是第j个元素前j-1个元素首尾重合部分个数加一,当然,为了能遍历完整,首尾重合部分的元素个数应取到最多,即next[j]应取尽量大的值,原因挺好理解的,可以想个例子模拟一下,会完美跳过正确结果。在上图中就是绿色元素的next值为蓝色元素的序号。也即,对于字符串P,next[8]=4。如此,再看一下上面的动图是不是清楚了不少。

    • 最后,如果我们知道了一个字符串的next值,那么KMP算法也就很好懂了。相比朴素算法,当发生失配时,i不变,j=next[j]就好啦!接下来就是怎么确定next值了。

    四、手动写出一个串的next值

    我们规定任何一个串,next[1]=0。(不用next[0],与串的所有对应),仍是一张动图搞定问题:
    在这里插入图片描述
    这个扫一眼就能依次写出,会了这个方法,应付个期末考试没问题了。

    通过把next值“看”出来,我们再来分析next值,这就很容易得到超级有名的公式了,这个式子对后面的算法理解很重要!所以先要看懂这个式子,如果上面的内容通下来了,这个应该很容易看懂了:
    在这里插入图片描述

    五、求next的算法

    终于到了最后了~短的串的next值我们可以“看”出来,但长的串就需要借助程序了,具体算法刚接触的时候确实不容易理解,但给我的体验,把上面的内容写完,现在感觉简简单单了…先附上程序再做解释,(终于到了传说中的整整5行代码让我整理了一下午)。

    int GetNext(char ch[],int cLen,int next[]){//cLen为串ch的长度
        next[1] = 0;
        int i = 1,j = 0;
        while(i<=cLen){
            if(j==0||ch[i]==ch[j]) next[++i] = ++j;
            else j = next[j];
        }
    }
    
    • 还是先由一般再推优化:
      直接求next[j+1](至于为什么是j+1,是为了和下面的对应)
      根据之前的分析,next[j+1]的值为pj+1的前j个元素的收尾重合的最大个数加一。即需要满足两个条件,把它的值一步步“检验”出来。一是“个数最多”的,因此要从可能的最大值开始验;二是“首尾重合”,因此要一一对应验是否相等。
      不难理解,next[j+1]的最大值为j,所有我们从next[j+1]=j开始“验证”。有以下优先判断顺序:
      if(P1…Pj-1 == P2…Pj) => next[j+1]=j
      else if(P1…Pj-2 == P3…Pj) =>next[j+1]=j-1
      else if(P1…Pj-3 == P4…Pj) =>next[j+1]=j-2



      else if(P1P2 == Pj-1Pj) => next[j+1]=3
      else if(P1 == Pj-1) => next[j+1]=2
      else if(P1 != Pj-1) => next[j+1]=1

      每次前去尾1个,后掐头1个,直至得到next[j+1]

    • 再进一步想,next值是一个“工具”,我们单独的求next[j+1]是完全没有意义的,就是说要求next就要把所有j的next求出来。所有一般的,我们都是已知前j个元素的next值,求next[j+1],以此递推下去,求完整的next数组
      但是,上面的思考过程还是最根本的。所以问题变为两个:知道前j个元素的next的情况下,
      ①next[j+1]的可能的最大值是多少(即从哪开始验证)
      ②某一步验证失败后,需要“前去尾几个,后掐头几个?”(即本次验证失败后,再验证哪个值)
      看一下的分析:

    1、next[j+1]的最大值为next[j]+1。
    因为:
    假设next[j]=k1,则可以说明P1…Pk1-1=Pj-k1+1…Pj-1,且这是前j个元素最大的首尾重合序列。
    如果Pk1=Pj,那么P1…Pk1-1PK=Pj-k1+1…Pj-1Pj,那么k+1这也是前j+1个元素的最大首尾重合序列,也即next[j+1]的值为k1+1
    2、如果Pk1≠Pj,那么next[j+1]可能的次大值为next[next[j]]+1,以此类推即可高效求出next[j+1]
    这里不好解释,直接看下面的流程分析及图解

    开——始——划——重——点!
    从头走一遍流程
    ①求next[j+1],设值为m
    已知next[j]=k1,则有P1…Pk1-1 = Pj-k1+1…Pj-1
    如果Pk1=Pj,则P1…Pk1-1PK = Pj-k1+1…Pj-1Pj,则next[j+1]=k1+1,否则
    已知next[k1]=k2,则有P1…Pk2-1 = Pk1-k2+1…Pk1-1
    ⑤第二第三步联合得到:
    P1…Pk2-1 = Pk1-k2+1…Pk1-1 = Pj-k1+1…Pk2-k1+j-1 = Pj-k2+1…Pj-1 即四段重合
    ⑥这时候,再判断如果Pk2=Pj,则P1…Pk2-1P~k2 = Pj-k2+1…Pj-1Pj,则next[j+1]=k2+1;否则再取next[k2]=k3…以此类推

    上面几步,耐心看下来,结合那个式子很容易看懂。最后,再加一个图的模拟帮助理解:
    1、要求next[k+1] 其中k+1=17
    在这里插入图片描述
    2、已知next[16]=8,则元素有以下关系:
    在这里插入图片描述
    3、如果P8=P16,则明显next[17]=8+1=9
    4、如果不相等,又若next[8]=4,则有以下关系

    在这里插入图片描述
    又加上2的条件知
    在这里插入图片描述
    主要是为了证明:
    在这里插入图片描述
    5、现在在判断,如果P16=P4则next[17]=4+1=5,否则,在继续递推
    6、若next[4]=2,则有以下关系
    在这里插入图片描述
    7、若P16=P2,则next[17]=2+1=3;否则继续取next[2]=1、next[1]=0;遇到0时还没出结果,则递推结束,此时next[17]=1。最后,再返回看那5行算法,应该很容易明白了!

    展开全文
  • 数据结构和算法关系

    千次阅读 2017-06-05 15:36:48
    数据结构:数据与数据之间的结构关系(数组、队列、树、图等结构)算法:解决问题的步骤总结:1、程序 = 数据结构 + 算法 。数据是程序的中心。数据结构和算法两个概念间的逻辑关系贯穿了整个程序世界,首先二者表现...

    数据结构:数据与数据之间的结构关系(数组、队列、树、图等结构)

    算法:解决问题的步骤

    总结:

    1、程序 = 数据结构 + 算法 。数据是程序的中心。数据结构和算法两个概念间的逻辑关系贯穿了整个程序世界,首先二者表现为不可分割的关系。没有数据间的有机关系,程序根本无法设计。

    2、数据结构与算法关系:数据结构是底层,算法高层。数据结构为算法提供服务。算法围绕数据结构操作。

    3、解决问题(算法)需要选择正确的数据结构。例如:算法中经常需要对数据进行增加和删除用链表数据结构效率高,数组数据结构因为增加和删除需要移动数字每个元素所有效率低。

    4、数据结构特点:每种数据结构都具有自己的特点。例如:队列:先进先出。栈:先进后出。等等

    5、算法的特性:算法具有五个基本特征:输入、输出、有穷性、确定性和可行性。

    6、数据结构应用:数据结构往往同高效的检索算法、索引技术、排序算法有关

    7、数据结构(逻辑数据结构)通过计算机语言来实现数据结构(存储数据结构)。例如:树型数据结构:通过计算机语言中的数组(节点)和指针(指向父节点)来实现。

    8、存储结构:逻辑数据结构的实现。存储结构通过计算机语言实现。 例如:堆数据结构,堆是一棵完全二叉树,所以适宜采用顺序存储结构(顺序存储:数组),这样能够充分利用存储空间。

    9、算法目的:算法是为数据结构服务。例如:数据结构通常伴随有查找算法、排序算法等

    10、数据结构的优劣:一种数据结构的优劣是在实现其各种运算的算法中体现的。

    二、数据结构:分为逻辑数据结构和存储数据结构两种
    (1)顺序存储方法(顺序存储结构)
    (2)链接存储方法(链式存储结构)
    同一种逻辑结构可采用不同的存储方法(以上两种之一或组合),这主要考虑的是运算方便及算法的时空要求。

    展开全文
  • 基于语义依存关系的相似度算法简述
  • [GIS算法] 拓扑关系

    千次阅读 2020-03-24 14:27:20
    文章目录拓扑关系数据结构拓扑关系的自动建立弧段的预处理直线段相交的判断方法自相交弧段处理弧段相交打断处理结点匹配算法建立拓扑关系计算结点关联弧段的方位角,并按由小到大排序左转算法岛的判断 拓扑关系 「...
  • 数据结构、算法、程序的关系

    千次阅读 2020-06-02 01:14:18
    这里写目录标题初衷数据结构、算法、程序的联系 初衷    数据结构、算法、程序的联系 数据结构 = 数据 + 结构 算法 = 算 + 法 程序 = (流)程 + (顺)序 反爬虫措施,读者略过: 转载请标明转自:...
  • 分治算法会用到递归,递归函数的复杂度都普遍高于非递归函数,请问分治算法使用递归的意义是什么,对分治的复杂度有什么影响呢
  • 算法和数据结构的关系

    千次阅读 2019-07-16 16:11:41
    算法和数据结构的关系 概述 很多场景或者书籍都会讲算法和数据结构捆绑在一起进行讲解,那为什么算法和数据结构密不可分呢? 概念 数据结构: 是指一组数据的存储结构。 举个例子:电影院里面的座位是按照几排几号...
  • 人脸检测算法和定位算法一样吗?可以说是同一种算法吗?还是包含的关系
  • 根据linuxcnc中的轨迹规划模块勾画的函数调用关系图以及一些注释,尚未完全完成,但耗费本人一周多时间。此文档对于立志于研究linuxcnc以及运动控制插补算法的人大有裨益。
  • 数据结构与算法关系

    千次阅读 2019-07-02 09:35:31
    数据结构与算法关系 数据结构和算法的重要性 算法是程序的灵魂,优秀的程序可以在海量数据计算是,依然保持高速计算 一般来讲,程序会使用内存计算框架(比如spark)和缓存技术(比如redis等)来优化程序。 那...
  • 详解:数据,算法,模型之间的关系

    万次阅读 多人点赞 2018-09-08 09:45:02
    终究觉得它还不够那么的直观和形象的解释清楚机器学的过程和数据、算法以及模型之间的关系。引出一个象形直白简单的例子教大家如何区分数据、算法、模型之间的关系。希望能够帮到初学者。 相比于一上来就去理解...
  • 两个概念模型及算法之间的关系

    千次阅读 2012-01-11 20:17:27
    两个概念模型及算法之间的关系 在介绍具体链接分析算法之前,首先介绍两个概念模型,并对各个链接分析算法之间的关系进行说明,这样有助于读者从宏观角度理解各个算法的基本思路与传承关系。 随机游走模型(Random...
  • 判断点与多边形位置关系算法

    千次阅读 2008-12-23 14:37:00
     //该算法不仅和射线算法有相同的效率,而且对射线算法中特殊情况的处理近乎完美,也很好的避开了对转角算法中arccos值的计算, //该算法为《地理信息系统算法基础》(张宏等,科学出版社)中转角算法的改进版本。...
  • 数据结构和算法关系和区别

    万次阅读 多人点赞 2019-02-01 13:45:40
    数据结构和算法之间完全是两个相互独立的学科,如果非说它们有关系,那也只是互利共赢、“1+1&gt;2”的关系。 最明显的例子,如果你认为数据结构是在讲算法,那么大学我们还学《算法导论》,后者几乎囊括了前者...
  • 算法算法评价

    万次阅读 多人点赞 2019-07-05 20:42:11
    一、算法的基本概念 算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。具有以下性质: 1.有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都可在有穷时间内...
  • 算法与程序的关系

    千次阅读 2013-07-26 09:37:23
    一个程序应包括: ⑴ 对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构(data structure)。 ...即操作步骤,也就是算法(algorithm...程序 = 算法 + 数据结构 + 程序设计方法 + 语言工具和环境
  • 遗传算法

    万次阅读 多人点赞 2019-04-06 21:41:47
    使用遗传算法求解多峰函数的最大值,是我的一项课程作业,做完之后,顺便把文档整理出来做个记录。全部内容如下: 1、问题描述 编程实现遗传算法,并求解多峰函数的最大值。多峰函数的表达式如下所示: 用MATLAB...
  • 程序、算法和数据结构的关系

    万次阅读 2017-10-24 10:29:00
    算法的主要目的在于为人们提供阅读了解所执行的工作流程与步骤。数据结构与算法要通过程序的实现,才能由计算机系统来执行。可以这样理解,数据结构和算法形成了可执行的程序。而程序能否快速而有效地完
  • 算法讲座,算法公开课,创业活动,算法班集锦 近期活动: 2014年9月3日,第8次西安面试&算法讲座视频 + PPT 的下载地址:http://blog.csdn.net/v_july_v/article/details/7237351#t40; 2014年10月18日,...
  • 趣写算法系列之--匈牙利算法

    万次阅读 多人点赞 2013-07-18 13:39:59
    【书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程,这只是刚开始的样稿,其实我们也才刚开始】 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是...
  • 算法描述

    千次阅读 2019-09-22 17:40:02
    1.算法、语言、程序的关系 首先分析数据结构中算法、语言和程序的关系。 (1)算法:描述数据对象之间的关系(包括数据逻辑关系、存储关系描述)。 (2)描述算法的工具:算法可用自然语言、框图或高级程序设计...
  • 好友推荐算法-基于关系的推荐

    万次阅读 2016-08-13 09:09:18
    最近在搞社交网络的算法,前面简单叙述了pagerank的相关以及graphx的实现,现在简单介绍好友推荐算法,每当我们在QQ的添加好友等的时候,下面总会出现腾讯推荐给我们的好友,你会发现推荐的好友大多都是你某个好友的...
  • DFA 算法

    万次阅读 多人点赞 2020-05-03 22:43:02
    DFA算法的简单介绍以及DFA算法在关键词匹配中的应用,如何简单地使用 Python 3.X 去实现 DFA 算法,来帮助我们从文本中抽取关键词,以及对敏感词进行识别。
  • TF-IDF算法介绍及实现

    万次阅读 多人点赞 2018-08-07 19:17:45
    1、TF-IDF算法介绍 (1)TF是词频(Term Frequency) (2) IDF是逆向文件频率(Inverse Document Frequency) (3)TF-IDF实际上是:TF * IDF 2、TF-IDF应用 3、Python3实现TF-IDF算法 4、NLTK实现TF-IDF算法 5...
  • 算法总结-1算法入门

    千次阅读 多人点赞 2019-09-06 18:54:00
    算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。 简单地说,...
  •  国密算法由国家密码局发布,包含SM1\ SM2\ SM3\ SM4\ SSF33算法;国际算法由美国的安全局发布,是现今最通用的商用算法。本文以分组密码算法(DES和SM4)、公钥密码算法(RSA和SM2)、摘要算法(SM3)为例,和大家...
  • 优化算法——模拟退火算法

    万次阅读 多人点赞 2015-04-30 15:55:43
    模拟退火算法原理 模拟退火算法 模拟退火算法过程 模拟退火算法流程 模拟退火算法的Java实现 Java代码 最后的结果模拟退火算法原理爬山法是一种贪婪的方法,对于一个优化问题,其大致图像(图像地址)如下图所示: ...
  • 一张图理解数据结构与算法关系

    千次阅读 2018-06-07 10:13:24
    一句话:相互之间存在关系的数据元素的集合就是数据结构,算法是解决特定问题的有限求解步骤。 一张图: 学习数据结构与算法有什么用呢?拿一个厨师的厨艺来比较的话,真正的大厨一般不是那种能做各种花样的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 963,462
精华内容 385,384
关键字:

关系算法