精华内容
下载资源
问答
  • 所以应该归于最快的算法之列,而且由于没有使用递归,使得对系统资源占用也不大,但还是有缺点,缺点之一就是它不属于原址排序,但它是稳定。即输出顺序严格按照输入顺序,即使是相同元素!常用于基数排序。...

    下面我要来介绍一下计数算法:

    这个算法的运行时间是线性的!这可是非常的难得!所以应该归于最快的算法之列,而且由于没有使用递归,使得对系统的资源占用也不大,但还是有缺点的,缺点之一就是它不属于原址排序,但它是稳定的。即输出顺序严格按照输入的顺序,即使是相同元素!常用于基数排序。以下内容摘自《算法导论》计数顺序的基本思想是:

    对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置上了。例如,如果有17个元素小于x,则x应该在第18个输出位置上。当有几个元素相同时,这一方案仍成立。

    下面是一个C语言版本的实例:

    /*
    下面宏定义中M代表输入数组元素中的最大值,
    N代表输入数组的实际长度
    计数排序原理:一个数组的位置是根据它前面有多少个数
    是小于它的,例如有14个数小于它,那么它的位置就应该
    在第15个位置,反之按从大到小排也是同样的原理
    */
    
    #include "stdio.h"
    #include "conio.h"
    #include "string.h"
    #define M  8
    #define N  10
    /*计数排序,运行时间:n ,堪称是最快的排序算法,而且不需要递归
    唯一的缺点是不是原址排序,因为需要临时数组
    k代表输入数组中的元素中最大值*/
    void count_sort(int A[],int B[])
    {
       int c[M+1];
       int i=0;
       for(i=0;i<=M;i++) /*必须对c[]进行初始化为0*/
       {
          c[i]=0;
       }
       for(i=0;i<N;i++)
       {
          c[A[i]]=c[A[i]]+1;
       }
       for(i=1;i<=M;i++) /*统计前面有多少个数是小于下标为i的数*/
          c[i]=c[i]+c[i-1];
       for(i=N-1;i>=0;i--)
       {
          B[c[A[i]]]=A[i];
          c[A[i]]--;
       }
    }
    main()
    {
        int a[N]={2,5,4,3,0,2,8,1,6,7},b[N+1],i;
        count_sort(a,b);
        printf("利用计数算法排序好的数组如下\n");
        for(i=1;i<=N;i++) /*0号元素坚决不能用!*/
            printf(" %d ",b[i]);
        getch();
    }


    展开全文
  • Hash算法

    2020-04-05 16:40:29
    运用书本上所学的知识,遍历两遍数组也是让我给做出来了,但是结果让人大跌眼镜的是,用时达到320ms,属于提交中垫底的部分。 之前也是做过几道题,提交也基本在百分之五十以上。我开始金评论区寻找答案,评论中...
        在力扣网上做了一道C语言的两数之和题,难度简单。运用书本上所学的知识,遍历两遍数组也是让我给做出来了,但是结果让人大跌眼镜的是,用时达到320ms,属于提交中垫底的部分。
    

    在这里插入图片描述 在这里插入图片描述在这里插入图片描述
    之前也是做过几道题,提交也基本在百分之五十以上。我开始金评论区寻找答案,评论中的C与C++的不多,算法都是两遍遍历数组,也是没有找到我想要的答案。最终在解法中发现了提高数组效率的Hash算法。以下是一位利用数组散列法高效率通过者的解法。在这里插入图片描述
    对hash数组进行边填充边检测的算法极大的提高了运行的效率。在这里插入图片描述
    在这里插入图片描述
    利用不同的算法,效率以下提升了几十倍。Hash算法是一个广义的算法,也可以认为是一种思想,使用Hash算法可以提高存储空间的利用率,可以提高数据的查询效率,也可以做数字签名来保障数据传递的安全性。刚接触不同算法的巨大妙用,让人惊叹。对于Hash算法也只是接触点皮毛,从此将在探索算法的道路上一去不返。不过暴力解法真上头。哈哈哈!算法小白,请多指教。

    展开全文
  • 之前文章讲到都是比较算法以下链接是之前文章提到过一些基本排序方法,其时间复杂度下界是O(nlogn)。今天提到两个主角分别是计数排序和桶排序,其时间复杂度好情况下能够达到O(n),它们不属于比较排序...

    之前的文章讲到的都是比较算法,以下链接是之前文章提到过的一些基本排序方法,其时间复杂度的下界是O(nlogn)。今天提到的两个主角分别是计数排序和桶排序,其时间复杂度好的情况下能够达到O(n),它们不属于比较排序。

    冒泡排序

    选择排序

    插入排序

    希尔排序

    归并排序

    堆排序

    快速排序

    首先,计数排序相当于是值与下标以及原序列中小于等于当前值的数目之间的一个相互映射关系,所以是一个线性关系。计数排序需要引入一个值K,K的值至少为原序列中的最大值加1。引入一个数组C[K],序列初始值都为0,开始遍历一遍原序列A[],当遍历到A[j],C[A[j]]+=1。然后对C作进一步处理:从第二个元素开始逐个加上前一个数,并保存。此时C[i]用于存储小于等于i的个数。因此i越大个数越多,i在原序列的位置越靠后,则用一个B[n],存储排序结果,此时B序列中C[A[j]]位置应当存储A[j]。排序完成,时间复杂度为O(2n+2K),即O(n+k),当K=O(n),时间复杂度是线性的。所以计数排序在序列最大值与序列个数相近或者序列最大值不是特别大的情况下效果尤佳。

    代码:

    import java.util.Arrays;

    public class CountingSort {

    public static int[] countingSort(int[] A,int n,int[] B,int k)

    {

    //下标以及值的映射关系,通过计数法来确定当前数在有序数列中的位置

    int[] C=new int[k];

    for(int i=0;i

    C[i]=0;

    for(int j=0;j

    C[A[j]]+=1;

    for(int h=1;h

    C[h]=C[h]+C[h-1];//C[h]表示所有小于等于h的元素个数

    for(int w=n-1;w>=0;w--)

    {

    C[A[w]]-=1;//通过C[h]的值即小于等于h的个数来确定该元素A[w]在B数组的位置,

    B[C[A[w]]]=A[w];//C[h]越小则说明小于等于A[w]的数越少,即A[w]越小,在B中的位置越靠前,实现排序目的。

    }

    return B;

    }

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    int[] A= {10,6,5,4,12,8,7};

    int[] Q= {0,1,0,1,0,2,2,1,0};

    int[] B=new int[A.length];

    int n=A.length;

    int k=13;

    System.out.println("计数排序后的结果:");

    System.out.println(Arrays.toString(countingSort(A,n,B,k)));

    }

    }

    测试结果:

    计数排序后的结果:

    [4, 5, 6, 7, 8, 10, 12]

    接下来讲述的是桶排序,其实桶排序的与计数排序类似,需要引入一个变量K,K的值大于序列的最大值。此处K表示有K个桶,引入一个表示桶的数组buckets[K],初始时各元素都为0,遍历一遍待排序序列A,序列值即为其对应的桶的序号,直接扔进对应的桶:buckets[A[i]]+=1。遍历完之后,开始按桶序号从小到大遍历桶,检查相应的元素,然后逐个存入A中,遍历结束则排序完成,获得的A为有序序列。

    由上可知,元素只需遍历一次原序列,然后需要遍历两次桶,所以时间复杂度为O(n+2K),属于线性排序。

    代码:

    import java.util.Arrays;

    public class BucketSort {

    public static int[] bucketSort(int[] A,int n,int k)

    {

    //将值作为桶的序号,将每个元素丢进相应的桶中,然后进行遍历桶,当桶的数字为多少时,则输出多少个桶的序号即元素值。

    int w,h,u;

    int[] buckets=new int[k];

    for(int j=0;j

    buckets[j]=0;

    for(int i=0;i

    buckets[A[i]]+=1;

    for(w=0,h=0;h

    {

    for(u=buckets[h];u>0;--u)

    A[w++]=h;

    }

    return A;

    }

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    int[] A= {10,6,5,4,12,8,7};

    int n=A.length;

    int k=13;

    System.out.println("桶排序后的有序序列为:");

    System.out.println(Arrays.toString(bucketSort(A,n,k)));

    }

    }

    测试结果:

    桶排序后的有序序列为:

    [4, 5, 6, 7, 8, 10, 12]

    由上可知,无论是计数排序还是桶排序,都需要引进一个K,而K跟序列的最值相关,所以这两个线性排序方法适用于固定序列以及K=O(n)的序列。

    转发请注明:转自http://blog..net/carson0408/article/details/78654904

    展开全文
  • 算法:集合划分原理及代码实现

    千次阅读 2017-03-15 14:50:44
    基本概念划分概念就是把一个集合A分成若干个子集a1、a2…过程,但是必须满足下列条件: 1.a1∪a2∪….∪an = A 2.对于所有i、j 属于0到n, ai∩aj = 空集。 3.a1…an 为空集例如 集合A = {1}划分只有一...

    在大学的离散数学中,会有关于划分原理的介绍。

    基本概念

    划分的概念就是把一个集合A分成若干个子集a1、a2…的过程,但是必须满足下列条件:
    1.a1∪a2∪….∪an = A
    2.对于所有i、j 属于0到n, ai∩aj = 空集。
    3.a1…an 不为空集

    例如
    集合A = {1}的划分只有一种情况:{1}
    集合A = {1,2}的划分有以下两种情况,分别是{1}{2},{1、2}
    集合A = {1, 2, 3}的划分有五种情况:①{1}{2}{3};②{1}{2、3};③{2}{1、3};④{3}{1、2};⑤{1、2、3}
    以此类推……

    计算

    那么就会出现一个问题,一个含有n个元素的集合的划分有多少种呢?
    B1、B2 …. Bn分别表示从1到n个元素的集合的划分的个数,而有上述可知B1= 1,B2 = 2,B3 = 5,且令B0=1。
    对一般的n有递推公式:
    Bn+1=C(n,0)B0+C(n,1)B1+.+C(n,n)Bn,
    C(n,k)是n元素取k个元素的组合数

    公式可以这么理解:
    n个元素的有Bn个分法,那么n+1个时,多加的这个设为t,
    1.把t单独拿出来,剩下的有Bn种分法。即C(n,n)Bn。
    2.t和其他元素当成一个整体,这其他元素可以是一个两个三个….
    当是一个的时候:则有C(n,n-1)种抽取这一个元素的抽法,而剩下的只有n-1个了,所以是C(n,n-1)Bn-1
    当是一个的时候:则有C(n,n-1)种抽取这一个元素的可能,而剩下的只有n-1个了,所以是C(n,n-1)Bn-1
    以此类推….
    当是n个的时候:则有C(n,0)种抽取这一个元素的可能,而剩下的只有0个了,所以是C(n,n-1)B0

    全部累加则为Bn+1=C(n,0)B0+C(n,1)B1+.+C(n,n)Bn

    代码实现待续….

    展开全文
  • Prim算法是通过每次选择提条代价最小边辑器相应 顶点加入到最小生成树中,因此来构造最小生成树。 二.基本步骤 设基本图为G=(V,E),最小生成树Tmst=(Vt,Et)。 ①从图G中任意顶点Vm(Vm属于V)开始,将Vm加入最小...
  • 事实上,深度优先搜索属于算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到能再深入为止,而且每个节点只能访问一次. 举例说明之:下图是一个无向图,如果我们从A...
  • 之前文章讲到都是比较算法以下链接是之前文章提到过一些基本排序方法,其时间复杂度下界是O(nlogn)。今天提到两个主角分别是计数排序和桶排序,其时间复杂度好情况下能够达到O(n),它们不属于比较排序...
  • 深度优先搜索属于算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到能再深入为止,而且每个节点只能访问一次. 举例说明之:下图是一个无向图,如果我们从A点发起...
  • 第一章程序设计基础知识 单项选择题 1以下( )是面向过程的程序设计...C)编写程序 D)调试和运行程序 3以下常用算法中适合计算等差级数的算法是( ) A)枚举法 B)递推法 C)分治法 D)排序法 4以下不属于算法基本特征的是( )
  • 人工智能是工程学一个分支,其基本目的是使计算机能够以与智能人类相似方式智能思考。以下是最常用于制作AI项目顶级语言:1. Python由于简单性,Python被认为是所有AI开发语言列表中第一位。属于python...
  • 人工智能是工程学一个分支,其基本目的是使计算机能够以与智能人类相似方式智能思考。以下是最常用于制作AI项目顶级语言:1. Python由于简单性,Python被认为是所有AI开发语言列表中第一位。属于python...
  • D ) A 自然语言 B 高级语言 C汇编语言 D 机器语言 2 算法具有5个特性以下选项中不属于算法特性的是( B ) A 有穷性 B 简洁性 C可行性 D 确定性 3以下叙述中正确的叙述是( A ) A 构成C程序的基本单位是函数 ...
  • Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...
  • Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...
  • 本卷共有 3 道大题 : 一单项选择题 50 道小题共 50 分 1下列计算机语言中 CPU能直接执行的是 ( ) 1 分 A自然语言 B 高级语言 C汇编语言 D 机器语言 2算法具有 5 个特性以下选项中不属于算法特性的是 ( ) 1 分 A有穷...
  • 本卷共有 3 道大题: 一单项选择题50 道小题共 50 分 1下列计算机语言中CPU 能直接执行的是( )1 分 A自然语 B高级语 C汇编语 D机器语 2算法具有 5 个特性以下选项中不属于算法特性的是 ( )1 分 A有穷性 B简洁性 C可行...
  • 尽管 GPU 擅长数据并行任务,但之前方法要么会在并行性的算法(如 k-min selection)上遭遇瓶颈,要么能有效利用内存层次结构。为此雷锋网了解到,他们提出一种可用于k-selection新设计,使其能以高达...
  • 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历算法这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。...
  • C#数据结构

    2013-12-10 11:49:54
    这是评价一个算法的最重要也是最基本的标准。算法的正确性还包括对于输入、 输出处理的明确而无歧义的描述。 2、可读性(Readability)。算法主要是为了人阅读和交流,其次才是机器的执行。 所以,一个算法应当思路...
  • BFS --- 广度优先搜索

    2019-11-02 11:53:18
    广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历算法这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。...
  • 《shellEval用户使用说明.pdf》含有详细的使用介绍,由于本文的主旨不是介绍其具体功能及使用,而是阐述内核算法的一般实现原理,因此这部分不是本文的主要内容。 三、 详细设计 3.1 程序模块设计 利用逆波兰表达式...
  • 一、Java基础--01

    2014-09-21 19:22:00
    第一题是关于基本的算法知识,这个很有必要去掌握以下,在学校也经常听老师们说找工作比试面试会出一些这方面知识,我拿到第一题是关于排序,虽然很简单,但是我还是要提醒一下基础太好同学去学习一下。...
  • 1、下列计算机语言中,CPU能直接执行的是( D )A、自然语言B、高级语言C、汇编语言D、机器语言2、算法具有5个特性,以下选项中不属于算法特性的是( B )A、有穷性B、简洁性C、可行性D、确定性3、以下叙述中,正确的...
  • (2) 以下数据结构中不属于线性数据结构的是(C) A. 队列 B. 线性表 C. 二叉树 D. 栈 (3) 在一棵二叉树上第5层的结点数最多是(B) 注:由公式2k-1得 A. 8 B. 16 C. 32 D. 15 (4) 下面描述中,符合结构化程序设计风格...
  • 数据结构C++版 绪论 数据结构+算法=程序 数据...常用数据处理技术包括查找技术排序技术索引技术等 数据元素是数据的基本单位构成数据元素的不可分割最小单位称为数据项 数据结构分为以下四类集合属于同一集合线性结构
  • A、马丁 理查德B、丹尼斯 麦卡利斯泰尔 里奇C、肯尼思 汤普森D、比雅尼 斯特劳斯特鲁普2、以下不属于算法基本特征的是( C ) 。A、有穷性B、有效性C、可靠性D、有一个或多个输出3、以下描述正确的是( C ) 。A、C...
  • 可自定义要搜索网站列表(以下简称目标列表) 可对目标列表网站网页内容进行检索 可对目标列表网站网页内容进行自动分类处理 可自定义更新周期及一些相关性能参数 系统主要功能模块 网络蜘蛛 采集、解析并保存...
  • (2) 以下数据结构中不属于线性数据结构的是______。(C) A. 队列 B. 线性表 C. 二*树 D. 栈 (3) 在一棵二*树上第5层的结点数最多是______。(B) A. 8 B. 16 C. 32 D. 15 (4) 下面描述中,符合结构化程序设计风格的是__...
  •    深度优先搜索(Depth First Search,简称DFS) 属于算法的一种。其过程简要来说是对每一个可能的分支路径深入到能再深入为止,而且每个节点只能访问一次。 基本模板:    对于一个标准的DFS模板而言,其...
  •    深度优先搜索(Depth First Search,简称DFS) 属于算法的一种。其过程简要来说是对每一个可能的分支路径深入到能再深入为止,而且每个节点只能访问一次。 基本模板:    对于一个标准的DFS模板而言,其...

空空如也

空空如也

1 2 3 4 5
收藏数 89
精华内容 35
关键字:

以下不属于基本算法的是