精华内容
下载资源
问答
  • 下面是我之前一直使用一个洗牌算法: let arr = [1,2,3,4,5,6,7,8,9]; Array.prototype.shuffle = function() { let temp = this; for (let i = 0; i < temp.length; i++) { let index...

    下面是我之前一直使用的一个洗牌算法:

        let arr = [1,2,3,4,5,6,7,8,9];
    
        Array.prototype.shuffle = function() {
          let temp = this;
          for (let i = 0; i < temp.length; i++) {
            let index       = Math.floor(Math.random()*temp.length);
            let itemAtIndex = temp[index];
            temp[index]     = temp[i]
            temp[i]         = itemAtIndex;
          }  
          return this;
        }
        console.log(arr.shuffle());

    但仔细想想,其实这是非常不合理的,因为已经交换过的位置,下次仍然可能会被选上。

    比较好的做法是排除已经交换过的位置,将剩下的位置洗牌,如下:

        /*
          1. 选中第一个元素,将其与n个元素中的任意一个交换(包括自己)。这时可以确定第一个元素
          2. 选中第二个元素,将其与n-1个元素中的任意一个交换(包括自己)。确定第二个元素
          3. 重复上面步骤,直到剩下一个。
          4. 该算法事件复杂度为O(n),无偏差,各元素随机概率相等
        */
        let arr = [1,2,3,4,5,6,7,8,9];
    
        Array.prototype.shuffle = function() {
          let temp = this;
          for (let i = temp.length - 1; i >= 0; i--) {
            let index       = Math.floor(Math.random()*(i+1));
            let itemAtIndex = temp[index];
            temp[index]     = temp[i]
            temp[i]         = itemAtIndex;
          }  
          return this;
        }
        console.log(arr.shuffle());
    

      

    转载于:https://www.cnblogs.com/guohaoyun/p/9010958.html

    展开全文
  • 关于冒泡排序算法的初学错误认识

    千次阅读 2016-03-02 22:02:43
    关于冒泡排序,我觉得是初学C语言时再也熟悉不过基本排序算法了,还记得在C语言课上老师“声情并茂”地讲着这个是考试重点内容。刚开始学人都以为这是一个再也简单不过的算法了,无非就是两个for循环嵌套嘛!...

    关于冒泡排序,我觉得是初学C语言时再也熟悉不过的基本排序算法了,还记得在C语言课上老师“声情并茂”地讲着这个是考试的重点内容。刚开始学的人都以为这是一个再也简单不过的算法了,无非就是两个for循环嵌套嘛!嗯,一开始我也是这样想的,不过随着学习数据结构的深入,我发现了课堂和书本上留下的一个巨大的坑。
    先来看你所熟悉的代码,以下称山寨算法:

    #include<stdio.h>
    void Maopo(int a[], int n)
    {
        int i, j, temp;
        for(i = 0; i<n-1; i++)
        {
            for(j = i+1; j<n; j++)
            {
            if(a[i]>a[j])
    
            {
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
            }
            }
        }
    }
    void main()
    {
        int a[10] = {9,7,8,6,1,2,3,5,4,0};
        printf("已知数组: ");
        for(int k = 0; k<10; k++)
            printf("%d",a[k]);
        printf("\n");
        Maopo(a, 10);
        printf("排序之后的数组:");
        for(int x = 0; x<10; x++)
            printf("%d",a[x]);
            printf("\n");
    
    }
    

    嗯,没错,一个循环嵌套就轻松搞定了。懵懂无知的初学者认为这样已经万事大吉了,的确无论是怎样凌乱的序列交给以上程序都能正确排列出来,但是经过以后数据结构的深入学习后,我们还要考虑到一个算法的执行效率。好的算法能事半功倍,坏的算法能事倍功半。
    先来看一下冒泡派寻的本质,它的思想是两两比较,然后从下向上比较排序,假设有n个元素,那么每次会发生n-1次的比较。照着以上代码,它并没有实现两两比较的意思。两两比较,即相邻两者互相比较,显然上述代码是死摁着一个元素让其分别与后续元素分别比较,当与后续全部元素都比较完成后。再开始死摁第二个头元素,重复循环。排序效率明显就下降了,依照此代码,我们只要稍微修改几处就能将山寨变成正版行货!
    先亮出正版代码:

    #include<stdio.h>
    void Maopo(int a[], int n)
    {
        int i, j, temp;
        for(i = 0; i<n-1; i++)
        {
            for(j = n-1; j>i; j--)
            {
            if(a[j-1]>a[j])
    
            {
            temp = a[j];
            a[j] = a[j-1];
            a[j-1] = temp;
            }
            }
        }
    }
    void main()
    {
        int a[10] = {9,7,8,6,1,2,3,5,4,0};
        printf("已知数组: ");
        for(int k = 0; k<10; k++)
            printf("%d",a[k]);
        printf("\n");
        Maopo(a, 10);
        printf("排序之后的数组:");
        for(int x = 0; x<10; x++)
            printf("%d",a[x]);
            printf("\n");
    
    }

    看出哪里不一样了吗。其实只是变动了内部for循环的范围,让其从后比较,也就是从下比较依次向上,两两互换。经过改动的代码,其效率在很大程度上得到了改善和提高。

    展开全文
  • 最近有网友在微博上向我反映,《算法的乐趣》随书例子代码中关于农历历法演示程序出了BUG,并截了图给我,我开始以为是算法某些部分不兼容64位系统,后来发现在32位系统上一样有问题,什么问题呢?...

    最近有网友在微博上向我反映,《算法的乐趣》随书的例子代码中关于农历历法的演示程序出了BUG,并截了图给我,我开始以为是算法中的某些部分不兼容64位系统,后来发现在32位系统上一样有问题,什么问题呢?先看看截图:

    这里写图片描述

    看到了吧,“三十月大”,走查代码,发现是处理农历闰月的时候重拍月序关系,导致越界访问了。对了一下历法,2015年不是闰年,怎么会走到闰月处理的流程中去了呢?
    跟了一下代码,终于找到原因了,原来是“民间历法”和“历理历法”的差异捣的鬼。先复习一下《 算法系列之二十:计算中国农历(二) 》中关于“民间历法”和“历理历法”的小知识:

    新中国成立以后没有颁布新的“官方农历历法”,将历法和政治分离体现了时代的进步,但是由于没有 “官方历法”,也引起了一些问题。比如我国现在采用的农历历法是《时宪历》,它源于清朝顺治年间(公元1645)颁布的《顺治历》,它有两个不足之处:一个是日月合朔和节气的时间以北京当地时间为准,也就是东经116度25分的当地时间,其节气和新月的观察只适用于中原地区。其它经度的地方,因为时间的关系,对导致日月合朔和节气时间的差异导致置闰和月顺序各不相同。另一个不足之处就是日月合朔时间和节气时间判断不精确,如果日月合朔时间和节气时间在同一天,不管具体的时间是否有先后,一律将此节气算做新月中的节气,这样一来,如果这个节气是中气,就会影响到闰月的设置。历理历法针对这两点进行了改进,对节气时间和日月合朔时间统一采用东经120度即东八区标准时,这样在任何时区的节气和置闰结果都是一样的,以东八区标准时为准。对于节气时间和日月合朔时间在同一天的情况,精确计算到时、分、秒,只有日月合朔时间在节气时间之前,这个节气才包含在次月内。历理历法从理论上讲更符合现代天文学的精确计算,但是需要注意的是,历理历法仍然只是存在于理论上的历法,我国现行的农历历法依然是民间历法《时宪历》或《顺治历》。

    对比一下计算得到的儒略日,2014年的冬至节气是2014年12月22日 07时02分,2014年农历冬月(十一月)初一刚好也是这一天,具体时间是2014年12月22日 09时35分。如果严格按照历理历法,这个冬月的朔日应该算在2015年农历年中,也就是说,2015年应该是闰年(2015年冬至是2015年12月22日12时47分,两个冬至节气之间有13个朔日)。但是实际历法是2014年是闰年,因为我们目前仍然采用的是民间历法,当节气和朔日在同一天时,不管实际的先后顺序,一律将此节气算作此农历月的中气,实际上就把这个农历月划到了2014年,这样以来,2014年就多了一个朔望月,自然就在2014年置闰了,2015年就不应该是闰年了。
    随书给出的算法简单地按照历理历法计算闰年,将2014年12月22日 09时35分这个新月算作2015年,刚好这个月没有中气(冬至就是中气,但是因为早了2个小时,就被算作上个月的节气了),于是就按照规则置闰,于是就越界了。
    知道问题原因了,解决方法就简单了。要么仍然按照历理历法处理,只需要解决置闰算法部分的异常,解决越界问题就行了。要么按照民间历法来,当冬至和朔日是同一天时,无论实际的时间先后,都将冬至节气算作这个月的中气。

    展开全文
  • 买了一本胡凡,曾磊的算法笔记。在做过程中发现了一道错误,拿出来分享和记录一下。 题目: 1009 说反话 (20 分) 给定一句英语,要求你编写程序,将句中所有单词顺序颠倒输出。 输入格式: 测试输入包含一个...

    买了一本胡凡,曾磊的算法笔记。在做的过程中发现了一道错误,拿出来分享和记录一下。

    题目:

    1009 说反话 (20 分)
    给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

    输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80
    的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1个空格分开,输入保证句子末尾没有多余的空格。

    输出格式: 每个测试用例的输出占一行,输出倒序后的句子。

    输入样例: Hello World Here I Come
    输出样例: Come I Here World Hello

    以下是书本代码:

    #include<cstdio>
    #include<cstring>
    int main()
    {
    	char str[90];
    	gets(str);
    	int len=strlen(str);
    	//printf("%d\n",len);
    	int r=0,h=0;  //r为行,h为列
    	char ans[90][90];   //ans[0] --ans[n]存放单词 
    	for(int i=0;i<len;i++)
    	{
    		if(str[i]!=' ')
    		{
    			ans[r][h++]=str[i];
    		}
    		else{
    			ans[r][h]='\0';  
    			r++;
    			h=0;
    		}
    	}
    	
    	for(int i=r;i>=0;i--)
    	{
    		printf("%s",ans[i]);
    		if(i>0) printf(" ");
    		 }     
    	return 0;
    }
    

    在输出时答案是这样的:
    在这里插入图片描述
    这是因为这里的程序缺少了一行代码,忘记了处理当处理最后一个字符come里的e的时候,h++,已经超出了字符串的长度,所以需要在最后加一句ans[r][h]=’\0’;

    以下是正确代码:

    #include<cstdio>
    #include<cstring>
    int main()
    {
    	char str[90];
    	gets(str);
    	int len=strlen(str);
    	//printf("%d\n",len);
    	int r=0,h=0;  //r为行,h为列
    	char ans[90][90];   //ans[0] --ans[n]存放单词 
    	for(int i=0;i<len;i++)
    	{
    		if(str[i]!=' ')
    		{
    			ans[r][h++]=str[i];
    		}
    		else{
    			ans[r][h]='\0';  
    			r++;
    			h=0;
    		}
    	}
    	ans[r][h]='\0';
    	for(int i=r;i>=0;i--)
    	{
    		printf("%s",ans[i]);
    		if(i>0) printf(" ");
    		 }     
    	return 0;
    }
    

    在这里插入图片描述

    展开全文
  • 如果有错误希望各位能够指出,上文也说到过,我觉得成长建立于不断错误的改进之中。 最开始学习C语言的时候,对于书面开始讲解的流程图与算法并没有太多的感觉,就像是与自己平时并没有太多的关系。但事实上,在后面...
  • 涉及到关于数据结构一些学习方法。...内容:大多数同学犯最大的错误,就是在学习上犯完美主义毛病。乃至后续很多其他问题,在我看来都是和这个问题直接相关。 举个经典例子:背英语...
  • 我们尝试用plato实现了一个在图上找环的算法,具体约束有:从给定节点集合sub_node出发,对环要求是长度大于等于k,当找到符合要求数目超过给定值num时,则中止。 我们...
  • 错误是由于开启了FIPS验证策略导致部分算法不能通过验证,后来我查了下所谓FIPS就是 Federal Information Processing Standard,中文名叫联邦信息处理标准,FIPS 是由两个政府主体开发标准。一个是美国国家...
  • 本人脑子不 怎么好使,写了一个关于验证码的算法,但是总是不能达到理想效果, 验证码的算法大致采用随机 4 个 random() 算法,来产生 4 位验证码,但是,在服务器不重启条件下,不管怎么刷新验证页面,所...
  • 刷了一段时间后,逐渐发现一些问题了,有一次,看了题目条件后,总是感觉不对,因为按照题目要求算法,根本得不出来指定输出结果,所以直接改了题目条件试了一下,果然给条件错误,还好,那只是...
  • 1、课本41页,蛮力法求解凸包问题。...(显然意图是出序列第一个元素放在r[0]中),但下面do循环要使用r[0]作比较选出小值,r[0]值会改变,最后i在改变后,r[i]值为空,又将r[0]赋值给最新r[i],此时...
  • 到最后在判定数组中所有对应点是不是为1,但是这样样例通过率只为50,有什么错误请大老看一下 谢谢。 ``` 题目描述 给你坐标轴上n个点,和n条线段,能否找到一种配对方案使得点与线段之间能形成一一匹配,...
  • 明确一点,用scanf进行输入,一定要明确输入到哪里,也就是告诉scanf地址位置,所以就需要有取地址符&。而对于数组名而言,数组名本身就是地址,所以不需要&。但是如果是数组某一项,那就必须要有&...
  • 这是关于python24小游戏来进行验证,然后发现这样的算法是没有列举出所有情况,算法的主要代码如下:最简单一个数组验证就是1,5,5,5这组数据是可以组成24点但是这个算法却得不到结果 import random ...
  • 关于遗传算法的函数优化应用方面问题,出现了内存溢出,没找到哪里错误 参考代码地址为http://blog.csdn.net/ebowtang/article/details/50938396 很多人应该是看这个代码入门遗传算法的 自己运行代码如下 头文件...
  • 最近工作上需要改进des算法,以达到防止DPA...现把文章中错误的地方记录如下。 文章中所说的修改流程如下图所示,这是完全没有问题的。文章中对下图中的一些数据作这样的注释: (1)X为8字节的随机数; (2)X1 = IP
  • 最近在学习基于物品协同过滤推荐算法,是基于评分预测,数据用了movielens,发现大部分网上实现都划分了测试集和训练集,我目前理解是这样 1. 把所有user-movie-rate划分测试集和训练集 2. 使用...
  • viterbi算法是一种动态规划算法,用于寻找最优隐含状态序列。(原谅我不会输公式) ...算法出现歧义的地方在(2)的递推算法的理解上,max和argmax对应的是右边的整个式子还是单指中括号内部,我发
  • 关于快速幂算法

    2020-04-07 21:47:33
    快速幂就是快速算底数n...所以快速幂算法就是主要用于求指数很大幂,而且避免出现超时的错误关于取模运算运算法则: 1.(a + b) % c= (a % c + b % c) % c 2.(a - b) % c = (a % c - b % c) % c 3.(a * b) % ...
  • 最近刚开始看了几道acm题,其中有几道是关于高精度算法的,经过多次百度,知道了算法的思路,但是在解题过程中还是有很多小错误值得引起自己注意 首先附上代码吧#include #include #define N 1010 int main...
  • 如果每个子集的错误都是独立,这种方法就可以减小误差。Variance一定减小。 在决策树方面,这种方法尤为有效。缺点是解释性降低。代表算法有random forest。 boosting 每一次迭...
  • 关于回溯剪枝算法的讨论

    千次阅读 2011-09-30 14:45:11
    这个假期笔者接触了一些比较有代表意义回溯题目,从一些犯下的错误中获得了一些感受,下面谈一谈我一点粗浅体会。 一、谨慎地辨别是不是仅用贪心算法而不用回溯就可以解决问题 大家知道,
  • 首先是我出现问题代码如下 // An highlighted block import pandas as pd from imblearn.over_sampling import SMOTE from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import ...
  • 刘玉斌同志提出了“在模糊综合评判时 ,取大取小算法是一个错误算法”这一论点 ,本文通过适当理论分析说明取大取小算法是模糊综合评判一个可取的算法.
  • //ac,改了一次,s[0]!...//注意去除前导0总是要考虑字符串长度为0,A1060也是这样 #include #include #include #include using namespace std; const int maxn=10010; string str[maxn];//注意这里str
  • AdaBoost分类器就是一种元算法分类器,AdaBoost分类器利用同一种基分类器(弱分类器),基于分类器的错误率分配不同权重参数,最后累加加权预测结果作为输出。 1、 Bagging方法 在介绍AdaBoost之前,我们首先...
  • 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。为表设置索引要付出代价:一是增加了...
  • AI技术 寻路问题常常会和人工智能(AI) 联系在一起,原因是 A*算法和许多其他寻路算法是由 AI...强化学习是依据经验的大脑学习建模——给定一些行为的集合和最终奖惩结果,它会学习出哪种行为是正确或错误的。遗传算法
  • 笔者还只是大一新生,在做我们学校OJ平台上时候遭遇了排序算法太慢而导致TLE(Time Limit Exceed,即超时)错误,于是上网查询了很多资料了解了快速排序算法。在学习该算法之后,由于觉得该算法实在是太厉害.....
  • 需要对A*寻路算法有一定的了解。(错误处望指正) 先给出一些基本概念(熟悉A*的读者可直接跳到证明处): 一张图中,以节点st为出发点,以end为目标节点,要求的是节点st到节点end的最短路径。 g(n)表示从点st...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,009
精华内容 403
关键字:

关于算法错误的是