精华内容
下载资源
问答
  • 算法

    2016-02-24 23:02:19
    1.算法的特性:有输入,输出,有穷性,可行性,确定性。 2.判断一个算法的效率,我们常看它们的最高介项,随着n的不断增大,在某一个时刻的n值之后的效率会越来越高。 3.算法的时间复杂度,这里用大O介方法表征。 ...

    1.算法的特性:有输入,输出,有穷性,可行性,确定性。

    2.判断一个算法的效率,我们常看它们的最高介项,随着n的不断增大,在某一个时刻的n值之后的效率会越来越高。

    3.算法的时间复杂度,这里用大O介方法表征。

    具体步骤是先计算该算法的总体执行次数,然后根据下列步骤推导,

    (1)用常数1取代运行时间中所有的加法常数。

    (2)修改后,只保留最高介项。

    (3)如果最高介项存在且不是1,则去掉与这个项相乘的常数。

    常见的时间复杂度:O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)

    4.算法的空间复杂度:是实现该算法所需要的存储空间。

    一般而言,我们都只考虑的是时间复杂度

    展开全文
  • 堆排序算法

    2012-08-29 21:04:06
    1.堆排序是利用堆的特性对记录序列进行排序的一种排序方法。 好的那么堆得特性是什么呢? 堆得定义: 堆是满足下列性质的数列{r1, r2, …,rn}:   如下图最开始是一个小顶堆。当把97和13 交换后不是堆了...
    堆排序算法
    1.堆排序是利用堆的特性对记录序列进行排序的一种排序方法。
    好的那么堆得特性是什么呢?
    堆得定义:
    堆是满足下列性质的数列{r1, r2, …,rn}:

     
    如下图最开始是一个小顶堆。当把97和13 交换后不是堆了,所以我们要调整根节点使之成为堆即筛选。(注意:是自堆顶到叶子的筛选过程,应该刚开始是堆由于把堆顶给换了,罪魁祸首是堆顶,其它小范围还是堆,所以是从堆顶开始)。

    这其中还要注意一点。97 与13 交换后应该跟27 比较为什么呢?
    1.因为是小顶堆,所以在97 的子节点里选择小者。如果把38放上去。38成了27的父节点比27大就不是小顶堆了。如果换成大顶堆就要比较把大的数据放上去。
    所以程序里交换时要先要比较一下。
    程序如下:
    1. //堆调整算法  
    2. void HeapAdjust (HeapType &H, int s, int m)  
    3. {   // 已知 H.r[s..m]中记录的关键字除 H.r[s] 之外  
    4.     //均满足堆的特征,本函数自上而下调整 H.r[s]  
    5.     //的关键字,使 H.r[s..m] 也成为一个大顶堆  
    6.      rc = H.r[s];    // 暂存 H.r[s]   
    7.      for ( j=2*s; j<=m; j*=2 ) { // j 初值指向左孩子  
    8.     自上而下的筛选过程;  
    9.      }  
    10.      // 自上而下的筛选过程  
    11.       if ( j<m && H.r[j].key>H.r[j+1].key )  ++j;       
    12.              // 左/右“子树根”之间先进行相互比较  
    13.              // 令 j 指示关键字较小记录的位置  
    14.       if ( rc.key <= H.r[j].key )  break;   
    15.            // 再作“根”和“子树根”之间的比较,  
    16.            // 若“>=”成立,则说明已找到 rc 的插  
    17.            // 入位置 s ,不需要继续往下调整  
    18.   
    19.       H.r[s] = H.r[j];   s = j;      
    20.         // 否则记录上移,尚需继续往下调整  
    21.   
    22.     H.r[s] = rc;  // 将调整前的堆顶记录插入到 s  (注意插入的位置为s j=2*s)  
    23. // HeapAdjust  

    2)建堆是一个从下往上进行“筛选”的过程 (首先要把底部的建成小堆,前面调整是因为只有堆顶,其它都已经是堆了。当我建堆到堆顶是也是从堆顶往下筛选)(所以说建堆大范围是从下往上筛选,在添加该结点时,还得从该节点往下筛选确保添加该节点后还是堆)。
    如下图建堆过程:  从97 开始->65->38 ->49这是从下往上(大范围从下往上)。第二个图到65时又 65与13 调整了(从上往下调整)。当到49时也是49<-> 13  <-> 27所以也是从上之下调整(为了确保加入该结点后还是堆)。



    程序如下:
    堆排序算法如下:
    1. void HeapSort ( HeapType &H ) {  
    2.   // 对顺序表 H 进行堆排序  
    3. for ( i=H.length/2;   i>0;   --i )  
    4.      HeapAdjust ( H.r, i, H.length );    // 建小顶堆  
    5.   
    6. for ( i=H.length; i>1; --i ) {  
    7.      H.r[1]←→H.r[i];             
    8.           // 将堆顶记录和当前未经排序子序列  
    9.           //  H.r[1..i]中最后一个记录相互交换  
    10.      HeapAdjust(H.r, 1, i-1);  // 对 H.r[1] 进行筛选  
    11. }  
    12. // HeapSort  


    展开全文
  • 堆排序算法 总结

    2015-05-27 11:27:00
    1.堆排序是利用堆的特性对记录序列进行排序的一种排序方法。 好的那么堆得特性是什么呢? 堆得定义: 堆是满足下列性质的数列{r1, r2, …,rn}: 例如以下图最開始是一个小顶堆。当把97和13 交换后不是堆...

    近期面试,老是被问到堆排序算法。
    回答时老是感觉思路不清楚,如今总结一下,把思路弄清楚的。

    1.堆排序是利用堆的特性对记录序列进行排序的一种排序方法。
    好的那么堆得特性是什么呢?
    堆得定义:
    堆是满足下列性质的数列{r1, r2, …,rn}:

     
    例如以下图最開始是一个小顶堆。当把97和13 交换后不是堆了,所以我们要调整根节点使之成为堆即筛选。(注意:是自堆顶到叶子的筛选过程,应该刚開始是堆因为把堆顶给换了,罪魁祸首是堆顶,其他小范围还是堆,所以是从堆顶開始)。

    这当中还要注意一点。97 与13 交换后应该跟27 比較为什么呢?
    1.由于是小顶堆,所以在97 的子节点里选择小者。假设把38放上去。38成了27的父节点比27大就不是小顶堆了。假设换成大顶堆就要比較把大的数据放上去。
    所以程序里交换时要先要比較一下。
    程序例如以下:
    //堆调整算法
    void HeapAdjust (HeapType &H, int s, int m)
    {   // 已知 H.r[s..m]中记录的keyword除 H.r[s] 之外
        //均满足堆的特征,本函数自上而下调整 H.r[s]
        //的keyword,使 H.r[s..m] 也成为一个大顶堆
         rc = H.r[s];    // 暂存 H.r[s] 
         for ( j=2*s; j<=m; j*=2 ) { // j 初值指向左孩子
        自上而下的筛选过程;
         }
         // 自上而下的筛选过程
          if ( j<m && H.r[j].key>H.r[j+1].key )  ++j;     
                 // 左/右“子树根”之间先进行相互比較
                 // 令 j 指示keyword较小记录的位置
          if ( rc.key <= H.r[j].key )  break; 
               // 再作“根”和“子树根”之间的比較,
               // 若“>=”成立,则说明已找到 rc 的插
               // 入位置 s ,不须要继续往下调整
    
          H.r[s] = H.r[j];   s = j;    
            // 否则记录上移,尚需继续往下调整
    
        H.r[s] = rc;  // 将调整前的堆顶记录插入到 s  (注意插入的位置为s j=2*s)
    } // HeapAdjust
    

    2)建堆是一个从下往上进行“筛选”的过程 (首先要把底部的建成小堆,前面调整是由于仅仅有堆顶,其他都已经是堆了。当我建堆到堆顶是也是从堆顶往下筛选)(所以说建堆大范围是从下往上筛选,在加入该结点时,还得从该节点往下筛选确保加入该节点后还是堆)。
    例如以下图建堆过程:  从97 開始->65->38 ->49这是从下往上(大范围从下往上)。第二个图到65时又 65与13 调整了(从上往下调整)。当到49时也是49<-> 13  <-> 27所以也是从上之下调整(为了确保增加该结点后还是堆)。



    程序例如以下:
    堆排序算法例如以下:
    void HeapSort ( HeapType &H ) {
      // 对顺序表 H 进行堆排序
    for ( i=H.length/2;   i>0;   --i )
         HeapAdjust ( H.r, i, H.length );    // 建小顶堆
    
    for ( i=H.length; i>1; --i ) {
         H.r[1]←→H.r[i];           
              // 将堆顶记录和当前未经排序子序列
              //  H.r[1..i]中最后一个记录相互交换
         HeapAdjust(H.r, 1, i-1);  // 对 H.r[1] 进行筛选
    }
    } // HeapSort

    note: 堆排序算法曾经看过几遍老是忘,问得时候思路不太清楚。仅仅要把关键几个点弄清楚,把思路搞清楚了以后就不怕了。







    转载于:https://www.cnblogs.com/hrhguanli/p/4532947.html

    展开全文
  • 阶为MB树具有下列结构特性:树根或者是一片树叶,或者其儿子数在2和M之间。除根外,所有非树叶节点儿子数在[M/2]和M之间。所有树叶都在相同深度上。所有数据都存在树叶上,在每一个内部节点上皆含有该...

    B树是一种常用的查找树,但不是二叉树。

    我们描述一棵B树时需要指定它的阶数,阶数表示了一个节点最多有多少个孩子节点。

    阶为M的B树具有下列结构特性:

    • 树的根或者是一片树叶,或者其儿子数在2和M之间。
    • 除根外,所有非树叶节点的儿子数在[M/2]和M之间。
    • 所有的树叶都在相同的深度上。

    所有的数据都存在树叶上,在每一个内部节点上皆含有该节点各儿子的指针P1、P2、......、Pm和分别代表在子树P2,P3,...,Pm中发现的最小关键字的值K1,K2,...,Km-1。当然有些指针是NULL,而其对应的Ki则是未定义的。

    对于每一个节点,其子树P1中所有的关键字都小于子树P2的关键字,如此等等。

    树叶包含所有实际数据,这些数据或者是关键字本身,或者是指向含有这些关键字的记录的指针。

    4阶B树更流行的称呼是2-3-4树,而3阶B-数叫做2-3树。

    这里我们拿一个2-3树来举例说明一些相关的操作。

    dd914f4dac0763003ebe56e09f0792fd.png

    这里用椭圆表示内部节点(非树叶),每个节点含有两个数据。椭圆中的短横线表示内部节点的第二个信息,它表明该节点只有两个儿子。

    树叶用方框画出,框内含有关键字。树叶的关键字是有序的。为了执行一次Find,我们从根开始并根据要查找的关键字与存储在节点上的两个(很可能是一个)值之间的关系确定(最多)三个方向中的一个方向。

    为了对尚未见过的关键字X执行一次Insert,我们首先按照执行Find的步骤进行。当到达一片树叶时,我们就找到了插入X的正确的位置。

    例如,为了插入关键字为18的节点,我们可以就把它加到一片树叶上而不破坏2-3树的性质。

    a73ad24d6d936d6d810508523d3bbfad.png

    不过,由于一片树叶只能容纳两个或三个关键字,因此上面的做法不总是可能的。如果我们现在试图把1插入到树中去,那么就会发现1所属于的节点已经满了。将这个新的关键字放入该节点使得它有了4个关键字,这是不允许的。解决的办法是,构造两个节点,每个节点有两个关键字,同时调整它们父节点的信息。

    1b090fdb2236930dd11e6227faa76818.png

    然而,这个想法也不总可能行得通,我们尝试将19插入到树中时就会看出问题。

    如果构造两个节点,每个节点有两个关键字,我们会得到如下的树。

    7d55bcffab3a701192689584072c35e0.png

    这棵树的一个内部节点有了4个儿子,可是我们只允许每个节点有3个儿子。解决方法很简单。我们只需要将这个节点分成两个节点,每个节点有两个儿子即可。

    9d4e4ab7ad0574c4c5862862a8679595.png

    现在如果插入关键字为28的一个元素,那么就会出现一片具有4个儿子的树叶。它可以分成两片树叶,每叶两个儿子。

    a84db321a54fee0646e8a3c2c23de1fd.png
    4a9429025dd8c8e73ec362422ec82ceb.png

    这样,又产生了一个具有四个儿子的内部节点。此时它被分成两个儿子节点。这个时候,我们得到一个特殊情况,通过创建一个新的根节点我们可以结束对28的插入。这是2-3树增加高度的(唯一)方法。

    1c4da5b926e883638759b7c1506a57ed.png

    还要注意,当插入一个关键字的时候,只有在访问路径上的那些内部节点才有可能发生变化。这些变化与这条路径的长度成比例;但是要注意,由于需要处理的情况相当多,因此很容易发生错误。

    B树实际用于数据库系统,在那里树被存储在物理的磁盘上而不是主存中。一般说来,对磁盘的访问要比任何的主存操作慢几个数量级。如果我们使用M阶B树,那么磁盘访问次数是O(logM/logN)。虽然每次磁盘访问花费O(logM/logN)来确定分支的方向,但是执行该操作的时间一般要比读存储器的区块(block)所花费的时间少得多,因此可以被认为是无足轻重的(只要M选择得合理)。

    展开全文
  • 学会分析研究计算机加工处理的对象的特征,以便为应用涉及的对象选择适当的逻辑结构,存储结构以及相应的算法,并初步掌握算法的时间分析以及空间分析技术 数据结构:是相互之间存在一种或多种特定关系的数据元素的...
  • 堆排序算法总结

    2015-03-20 19:17:39
    1.堆排序是利用堆的特性对记录序列进行排序的一种排序方法。 好的那么堆得特性是什么呢? 堆得定义: 堆是满足下列性质的数列{r1, r2, …,rn}:   如下图最开始是一个小顶堆。当把97和13 交换后不是堆...
  • 定义:一棵m 阶B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树; ⑵若根结点不是叶子结点,则至少有两棵子树; ⑶除根结点之外所有非终端结点至少有[m/2] 棵子树; ⑷所有...
  • 13. 一个算法应该具有“确定性”等5个特性,下面对另外4个特性的描述中错误是【 】 A. 有零个或多个输入 B. 有零个或多个输出 C. 有穷性 D. 可行性 14、一个线性表第一个元素存储地址是100,每个元素长度为2,则...
  • 定义:一棵m 阶B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树; ⑵若根结点不是叶子结点,则至少有两棵子树; ⑶除根结点之外所有非终端结点至少有[m/2] 棵子树; ⑷所有...
  • 1.下列哪些不是算法的基本特征( ) A:输入 B:输出 C:中间处理 D:可行性正确答案: C 知识点: 算法的五大特性:有穷 确切 输入 输出 可行(有效) 1、有穷性(Finiteness) 算法的有穷性是指算法必须能在...
  • 数据结构试题5.doc

    2020-09-02 14:20:56
    专业 专业 年级本专科 学号_ 姓 名 _ 密 封 线 至 学年第 学期 课程名称 数据结构 考试对象 计科信管本 试卷类型 5 考试时间 120 分钟 一选择题每小题2分共20分 1以下哪一个不是算法的特性 A有穷性 B确定性 C简洁性 ...
  • 《shellEval用户使用说明.pdf》含有详细的使用介绍,由于本文的主旨不是介绍其具体功能及使用,而是阐述内核算法的一般实现原理,因此这部分不是本文的主要内容。 三、 详细设计 3.1 程序模块设计 利用逆波兰表达式...
  • 索引

    2018-04-10 16:17:57
    1.2 查找算法 1.3 特性 缺点 2. 哈希索引 1. B_树索引 索引在包含多个列时候,列顺序变得十分重要,因为MySQL只能高效使用索引最左前缀列。 1.1 性质 B树 一棵m阶(任意节点子女数最多为m)B...
  • 通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着() A.数据具有同一特点 B.每个数据元素都一样 C.不仅每个数据元素所包含的数据项都一样,而且对应数据项的类型要一致 D.数据元素所包含的数据项...
  • 堆排序

    2014-04-15 19:42:20
    1.堆排序是利用堆的特性对记录序列进行排序的一种排序方法。 好的那么堆得特性是什么呢? 堆得定义: 堆是满足下列性质的数列{r1, r2, …,rn}:   如下图最开始是一个小顶堆。当把97和13 交换后不是堆了...
  • 堆排序关键过程

    2012-10-09 11:06:45
    1.堆排序是利用堆的特性对记录序列进行排序的一种排序方法。 好的那么堆得特性是什么呢? 堆得定义: 堆是满足下列性质的数列{r1, r2, …,rn}:   如下图最开始是一个小顶堆。当把97和13 交换后不是堆了...
  • (41) 在下列选项中,哪个不是一个算法一般应该具有基本特征(C) A. 确定性 B. 可行性 C. 无穷性 D. 拥有足够情报 (42) 希尔排序法属于哪一种类型排序法(B) A.交换类排序法 B.插入类排序法 C.选择类排序法 D.建...
  • (内有最新习题和ppt教程) 最新二级公共基础知识填空40题+80选择题 (1) 算法的复杂度主要包括______复杂度和空间复杂度。...(41) 在下列选项中,哪个不是一个算法一般应该具有的基本特征______。(C)...
  • 《数据结构 1800题》

    热门讨论 2012-12-27 16:52:03
    1. 算法的计算量的大小称为计算的(B )。【北京邮电大学2000 二、3 (20/8分)】 A.效率 B. 复杂性 C. 现实性 D. 难度 2. 算法的时间复杂度取决于(C )【中科院计算所 1998 二、1 (2分)】 A.问题的规模 B. ...
  • 因最先进入队列的元素将最先出队,所以队列具有先进先出的特性,体现“先来先服务”的原则。 队头元素q1是最先被插入的元素,也是最先被删除的元素。队尾元素qn是最后被插入的元素,也是最后被删除的元素。因此,与...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    答:对于复杂而开发时间紧项目时,可以采用C语言,但前提是要求对该MCU系统C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持数据类型和算法。虽然C语言是最普遍一种高级语言,但不同MCU厂家其...
  • Java生成密钥实例 1个目标文件 摘要:Java源码,算法相关,密钥 Java生成密钥、保存密钥实例源码,通过本源码可以了解到Java如何产生单钥加密密钥(myKey)、产生双钥密钥对(keyPair)、如何保存公钥字节数组、...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名数据传送给签名对象(须在初始化之后),用公钥...
  • 软件产品的特性是什么? 答: ● 软件是一种逻辑产品,具有无形性;  ● 软件产品的生产主要是研制;  ● 软件不存在磨损和老化问题,但存在退化问题;  ● 软件产品的生产主要是脑力劳动;  ● 软件产品...

空空如也

空空如也

1 2 3
收藏数 54
精华内容 21
关键字:

下列不是算法的特性