寒凝雪个人页面-阿里云开发者社区

个人头像照片 寒凝雪 TA的个人档案
5854
223

个人介绍

暂无个人介绍

擅长的技术

获得更多能力
通用技术能力:

暂时未有相关通用技术能力~

云产品技术能力:

暂时未有相关云产品技术能力~

阿里云技能认证

详细说明
  • 高分内容
  • 最新动态
  • 文章
  • 问答
正在加载, 请稍后...
滑动查看更多
正在加载, 请稍后...
暂无更多信息
  • 发表了文章 2017-08-01

    LINQ to SQL集成到应用程序中需考虑的一些问题

  • 发表了文章 2017-08-01

    LINQPad

  • 发表了文章 2017-08-01

    Windows系统下多标签功能终端工具Console2

  • 发表了文章 2017-08-01

    ADO.NET Entity Framework

  • 发表了文章 2017-08-01

    Windows Server 2008 与 .NET Framework 的版本之间有什么关系

  • 发表了文章 2017-08-01

    .NET Mass Downloader -整体下载.NET源码

  • 发表了文章 2017-08-01

    Rails框架流行在他的设计理念

  • 发表了文章 2017-08-01

    Silverlight 2 的基础XAML语法学习

  • 发表了文章 2017-08-01

    Silverlight概要

  • 发表了文章 2017-08-01

    [翻译]开发Silverlight 2.0的自定义控件

  • 发表了文章 2017-08-01

    Silverlight 2 DispatcherTimer和通过XAML创建UI元素

  • 发表了文章 2017-08-01

    Mono运行于IPhone之上

  • 发表了文章 2017-08-01

    asp.net mvc脚手架代码生成工具

  • 发表了文章 2017-08-01

    ASP.NET MVC Preview生命周期分析

  • 发表了文章 2017-08-01

    asp.net 性能调较

  • 发表了文章 2017-08-01

    面向服务架构(SOA)和企业服务总线(ESB)

  • 发表了文章 2017-08-01

    MSMQ 与ESB

  • 发表了文章 2017-08-01

    支持Visual Studio 2008和.NET 3.5的企业类库4.0

  • 发表了文章 2017-08-01

    Gallio 自动化测试平台

  • 发表了文章 2017-08-01

    Enterprise Library 4.0缓存应用程序块

正在加载, 请稍后...
滑动查看更多
  • 回答了问题 2019-07-17

    堆排序的具体算法

    1、 堆排序定义
    n个关键字序列Kl,K2,…,Kn称为堆,当且仅当该序列满足如下性质(简称为堆性质):
    (1) ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤ )

    若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。
    【例】关键字序列(10,15,56,25,30,70)和(70,56,30,25,15,10)分别满足堆性质(1)和(2),故它们均是堆,其对应的完全二叉树分别如小根堆示例和大根堆示例所示。

    2、大根堆和小根堆
    根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆。
    根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆。
    注意:
    ①堆中任一子树亦是堆。
    ②以上讨论的堆实际上是二叉堆(Binary Heap),类似地可定义k叉堆。

    3、堆排序特点
    堆排序(HeapSort)是一树形选择排序。
    堆排序的特点是:在排序过程中,将R[l..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系【参见二叉树的顺序存储结构】,在当前无序区中选择关键字最大(或最小)的记录。

    4、堆排序与直接插入排序的区别
    直接选择排序中,为了从R[1..n]中选出关键字最小的记录,必须进行n-1次比较,然后在R[2..n]中选出关键字最小的记录,又需要做n-2次比较。事实上,后面的n-2次比较中,有许多比较可能在前面的n-1次比较中已经做过,但由于前一趟排序时未保留这些比较结果,所以后一趟排序时又重复执行了这些比较操作。
    堆排序可通过树形结构保存部分比较结果,可减少比较次数。

    5、堆排序
    堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。

    (1)用大根堆排序的基本思想
    ① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
    ② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
    ③ 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
    ……
    直到无序区只有一个元素为止。

    (2)大根堆排序算法的基本操作:
    ① 初始化操作:将R[1..n]构造为初始堆;
    ② 每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。
    注意:
    ①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。
    ②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反:在任何时刻,堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止。

    (3)堆排序的算法:
    void HeapSort(SeqIAst R)
    { //对R[1..n]进行堆排序,不妨用R[0]做暂存单元
    int i;
    BuildHeap(R); //将R[1-n]建成初始堆
    for(i=n;i>1;i--){ //对当前无序区R[1..i]进行堆排序,共做n-1趟。
    R[0]=R[1];R[1]=R[i];R[i]=R[0]; //将堆顶和堆中最后一个记录交换
    Heapify(R,1,i-1); //将R[1..i-1]重新调整为堆,仅有R[1]可能违反堆性质
    } //endfor
    } //HeapSort

    (4) BuildHeap和Heapify函数的实现
    因为构造初始堆必须使用到调整堆的操作,先讨论Heapify的实现。
    ① Heapify函数思想方法
    每趟排序开始前R[l..i]是以R[1]为根的堆,在R[1]与R[i]交换后,新的无序区R[1..i-1]中只有R[1]的值发生了变化,故除R[1]可能违反堆性质外,其余任何结点为根的子树均是堆。因此,当被调整区间是R[low..high]时,只须调整以R[low]为根的树即可。
    "筛选法"调整堆
    R[low]的左、右子树(若存在)均已是堆,这两棵子树的根R[2low]和R[2low+1]分别是各自子树中关键字最大的结点。若R[low].key不小于这两个孩子结点的关键字,则R[low]未违反堆性质,以R[low]为根的树已是堆,无须调整;否则必须将R[low]和它的两个孩子结点中关键字较大者进行交换,即R[low]与R[large](R[large].key=max(R[2low].key,R[2low+1].key))交换。交换后又可能使结点R[large]违反堆性质,同样由于该结点的两棵子树(若存在)仍然是堆,故可重复上述的调整过程,对以R[large]为根的树进行调整。此过程直至当前被调整的结点已满足堆性质,或者该结点已是叶子为止。上述过程就象过筛子一样,把较小的关键字逐层筛下去,而将较大的关键字逐层选上来。因此,有人将此方法称为"筛选法"。
    具体的算法【参见教材】

    ②BuildHeap的实现
    要将初始文件R[l..n]调整为一个大根堆,就必须将它所对应的完全二叉树中以每一结点为根的子树都调整为堆。
    显然只有一个结点的树是堆,而在完全二叉树中,所有序号 的结点都是叶子,因此以这些结点为根的子树均已是堆。这样,我们只需依次将以序号为 , -1,…,1的结点作为根的子树都调整为堆即可。
    具体算法【参见教材】。

    5、大根堆排序实例
    对于关键字序列(42,13,24,91,23,16,05,88),在建堆过程中完全二叉树及其存储结构的变化情况参见【动画演示】。

    6、 算法分析
    堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。
    堆排序的最坏时间复杂度为O(nlgn)。堆排序的平均性能较接近于最坏性能。
    由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
    堆排序是就地排序,辅助空间为O(1),
    它是不稳定的排序方法。
    踩0 评论0
  • 回答了问题 2019-07-17

    学算法哪本书好

    刚看过一本算法的书,觉得还不错,可以看一下。《零基础学算法》(第二版) 戴艳 等编著
    踩0 评论0
  • 回答了问题 2019-07-17

    二进制是什么 怎么算

    逢二进一
    踩0 评论0
  • 回答了问题 2019-07-17

    用归纳法设计一个递归算法,求在A[1...N]中n个实数的平均数

    int avg(int* a,int x)
    {
    if(x==0)
    return a[x];
    else
    return (avg(a,x-1)+a[x])/2;
    }
    在main函数中使用:
    avg(a,x);//其中a是要求平均数的数组,x是数组的长度-1
    踩0 评论0
  • 回答了问题 2019-07-17

    请教 :C# 用递归算法 1,2,3,...,m 前m位的总和 是一道面试题

    public int sum(int number)
    {
    int endsum = 0;
    if (number == 1)
    { return 1; }
    else
    {
    for (int i = 0; i <= number; i++)
    {
    endsum = endsum + i;
    }

    return endsum;
    }
    }

    这样就可以计算出来了 测试过了
    踩0 评论0
  • 回答了问题 2019-07-17

    二进制数1100是二进制数的几倍110用计算器怎么算

    这问题提的 语句都不通顺......看不懂
    踩0 评论0
  • 回答了问题 2019-07-17

    求RSA非对称加密算法过程 P.Q.R.S.T.U.V.W.X.Y.Z 对应3.5.7.11.13.17.19.23.29.31.37求mod算法详细过程

    这太复杂了..
    踩0 评论0
  • 回答了问题 2019-07-17

    前端开发是否有必要知道数据结构和算法

    如果只是单纯做前端,没有。前端的核心是DOM。算法和数据结构是为了解决效率问题的,而提升前端的效率用到的概念往往仅仅是常识级别的。甚至一些流行的中小型库中都看不到任何数据结构。可以认为前端是程序员里的一个特例,一般程序员面对的是计算机,前端开发人员面对的仅仅是浏览器。如果只是关注前端,学习数据结构和算法的收益还不如去读jQuery源码。

    既然前端用不上,楼主还是问到了这个问题,那就说明楼主关注的不仅仅是如何成为一个熟练的前端,而是成为一个优秀的软件工程师。网站开发之所以流行,一部分是因为开发成本低。这些节省下来的成本,一部分就是开发人员的薪水。换句话说,前端开发简单,门槛低,所以收入低,可替代性强。跳出前端这个领域,把自己放到软件工程师的队伍里,再看这个问题,答案就显而易见了。如果只是专注于前端技术,那么能解决的也仅仅是一小部分问题。

    如果楼主关心的是如何更好地解决前端的问题,那么在相当长的一段路上数据结构和算法是优先级很低的。如果楼主关心的是自己的职业规划和自身素质的提升,数据结构和算法则在任何时候都是优先级最高的。
    踩0 评论0
  • 回答了问题 2019-07-17

    数据结构中排序方法有多少种

    1、插入排序(直接插入排序和希尔排序)
    2、选择排序(直接选择排序和堆排序)
    3、交换排序(冒泡排序和快速排序)
    4、归并排序
    5、基数排序
    直接插入排序:逐个将后一个数加到前面的排好的序中。在直接插入排序过程中,对其中一个记录的插入排序称为一次排序;直接插入排序是从第二个记录开始进行的,因此,长度为n的记录序列需要进行n-1次排序才能完成整个序列的排序。时间复杂度为O(n2)。
    希尔排序:希尔排序又称缩小增量排序,增量di可以有各种不同的取法,但最后一次排序时的增量必须为1,最简单可取di+1=di/2(取小)。时间复杂度为O(n(log2n)2)。
    直接选择排序
    说明:每次将后面的最小的找出来插入前面的已排好的序中。同理,具有n个记录的序列要做n-1次排序。
    时间复杂度为O(n2)。
    冒泡排序:两个两个比较,将大的往后移。通过第一次冒泡排序,使得待排序的n个记录中关键字最大的记录排到了序列的最后一个位置上。然后对序列中前n-1个记录进行第二次冒泡排序。。。对于n个记录的序列,共需进行n次冒泡排序。时间复杂度为O(n2)。
    快速排序:又叫分区交换排序,是对冒泡排序方法的一种改进。时间复杂度为O(nlog2n)。
    归并排序:将两个或两个以上的有序数据序列合并成一个有序数据序列的过程。时间复杂度为O(nlog2n)。
    踩0 评论0
  • 回答了问题 2019-07-17

    rsa算法中密钥e=3 、d=5,明文4求密文

    参考答案 欲知对岸事,就要渡过河。
    踩0 评论0
  • 回答了问题 2019-07-17

    用希尔排序算法对用户输入的一组数据按关键字进行排序输出

    //About_C团队解答
    //VC6.0环境下编译通过,希望满意(因为你没要求语言,所以我就用C++了)
    //任何问题,追问我哦 ^_^
    #include<iostream>
    #include<fstream>
    using namespace std;
    #define N 5
    typedef struct node{
    int key;
    char data;
    }Node;
    void ShellSort( Node data[], int n){
    Node tmp; int gap;
    gap = n / 2;
    while( gap > 0){
    for( int i = gap; i < n; i++){
    tmp = data[i];
    for( int j = i - gap; j >= 0; j -= gap){
    if( data[j].key > tmp.key){
    data[j+gap] = data[j];
    }else{
    break;
    }
    }
    data[j+gap] = tmp;
    }
    gap /= 2;
    }
    }
    int main(){
    Node data[N] = { 5, 'a', 4, 'b', 3, 'c', 2, 'b', 1, 'a'};
    ShellSort( data, N);
    for( int i = 0; i < N; i++){
    cout << data[i].key << ":" << data[i].data<< "\t";
    }
    cout << endl;
    return 0;
    }
    踩0 评论0
  • 回答了问题 2019-07-17

    如何使用javascript进行RSA/ECB/PKCS1Padding算法加密

    javascript rsa加密/java使用Cipher.getInstance("RSA/ECB/PKCS1Padding")解密
    1)服务器端获得生成密钥对;
    2)javascript使用公钥加密;
    3)java获得密文使用私钥解密;
    踩1 评论0
  • 回答了问题 2019-07-17

    整数数组A【N]设计递归算法。求数组中最大的整数。数组中N个数的平均值

    将栈中元素取出放进队列,再出对压回栈中。
    踩0 评论0
  • 回答了问题 2019-07-17

    linux下c++网络编程出现connection reset by peer,共有哪几种情况?求详解

    唉,我是学java的,就我而言,我感觉,你还是学。net吧,java里的东西实在是太多了,如果要想有所作为,没有5年时间以上,那是根本不可能的,一般情况下,如果你学java的话,就只java这一块,就你要掌握的理论知识最少也要13本书以上(每一本和算法导论厚度差不多),这只是仅仅的java这一块,还没有算数据库那一块,如果全算上的话,少说也有17,8本吧,这只是看书,还有经验,更何况你还是女孩,至于C这一块,我有还几个朋友都是在C这一块,我看他们掌握的东西也就是仅仅的七八本书而已,不过这一块也不好学,因为算法很难,但是只要你用2,3年时间把算法学完了,那基本上就是那基本,要学.net,就是先学C,你应该也学过一些C吧,知道他的东西也不多,就是比较烦,但是你只要学完了,再把算法和数据结构搞好了,基本上你就算是一个牛人了,随时代发展,随时补充点新鲜知识,基本上就没设么事了,而且C还有一个好处就是从C过度到C++很容易,再从c++到java也很容易,但是从java到c++很难,但是C(或者是.net)这一块就是很繁琐,但是只要你学会了就轻松了,所以我建议你去学。net,其实不管是java还是.net都不好学,java多而杂,.net有涉及C和C++,所以到底要学什么,你自己好好考虑考虑,多问问就业的人,现在相对于java而言,.net比较好就业,毕竟是微软这个巨头出的,呵呵,我能给你说的就这些了,你自己再好好想想吧,毕竟是一辈子的事,说实话,我不建议你学编程,很苦很累,就是男的而言30岁以后就都撑不住了,更何况是女的呢(如果你爬到项目经理了,那你也就轻松了,不过坚持下来并且能排上去比较难),当然我不是歧视,我感觉女孩应该是被爱的,而不是让你出去,经历风雨的,置于这些事还是让你的男朋友去操心吧,现在想找到对口专业的人很少,而且对口也不应定适合你,要说的都说完了,你自己再多考虑考虑吧, 三十岁以上还是程序员的就慢慢变少了,三十四五基本上就绝迹了(仅仅是程序员,不包括项目经理,设计师,分析师,架构师,顾问),一般情况下,只要你刚进公司只要能吃苦,基本上都可以混到项目经理这一职位,但是有一道坎比较难过,那就是进公司以后对新事物接受比较快,那你就OK了,我就知道一个和你一样是女孩,现在在华为,你想她这样只要能坚持两年出来以后,进别的公司肯定最少是项目经理,只要你能吃苦,你肯定可以,做程序员,是看两方面,经验还有您的功底基础,经验是靠时间积累的,而功底那就是基础了,所以没有必要担心这个,担心那个,再说了,就算再不行,到三十你的人际关系只要差不多,转行就对没有问题,所以没有必要大新那么多,只要决定了,那就走下去吧,如果不想干这一行,那你就要提前做打算了,因为你们女孩的青春浪费不起啊,不过这一行会比较累,加班是正常现象,又是一个项目做完了好要搞个通宵测试,有弊就有利,这一行只要你干得差不多,工资相对以别的行业来说的确是很高
    踩1 评论0
  • 回答了问题 2019-07-17

    小白,请教一些关于RSA加密的问题,已知密文c,模数n,公钥e,能否求出明文m?

    询问,能把你的C++代码发给我看一下么,我们也有类似的问题,我想看看源代码。
    我的邮箱[email protected]
    踩0 评论0
  • 回答了问题 2019-07-17

    ACMer必看的黑书究竟是什么书?

    黑基和联盟里面的才是必学的
    踩0 评论0
  • 回答了问题 2019-07-17

    执行二进制算术加运算,11001001+00100111起结果是

    还是一位一位的加,满2进1
    11001001 +
    00100111
    ----------------------
    11110000
    11001001 + 00100111 ---------------------- 11110000 从最右边开始,和我们小学的10进制整数相加一样,只是这个是二进制,逢2进1
    其实很简单,逢二进一 ,从最右边开始是1+1, 所以等于10, 0写出来,1进到前一位去,所以这里是1+1, 又等于10,0写出来,1又进到前一位,又是1+1=10,0写出来,1进到前一位,是1+1=10,0又写出来,1进到前一位,所以到这里是1+0=0。以此类推。
    踩0 评论0
  • 回答了问题 2019-07-17

    数据结构与算法分析C语言描述课本中的这个公式是什么意思啊?

    f(N)就是关于N的函数,比如说f(N)=N+1,
    由于你求和公式上的i是从1变换到N的,所以,这里N是一个常数,假设N=n,那么就拿上面的f(N)=N+1来说,把N=n带入f(N)中得到的是一个常数。因为i从1到N要加N次,每次的结果都是都已一样的,是f(n),那么加n次不就是nf(n)。
    把n换成N就是上面红线画的公式。
    踩0 评论0
  • 回答了问题 2019-07-17

    学习c++好 还是JAVA 更有前途???

    现在一般很高级的程序员必须要会多种计算机语言,而且必须精通
    踩0 评论0
  • 回答了问题 2019-07-17

    听耳机的时候靠什么原理来定位

    立体声只有两个喇叭。7.1声道好像是5个喇叭。现在大多数人都在用立体声,包括网吧。
    踩0 评论0
正在加载, 请稍后...
滑动查看更多
http://www.vxiaotou.com