首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 请教生成所有排列的算法,大家谁能证明一下
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ksharp2008
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-04-09 19:39:10 楼主
      就是离散数学及其应用里的那种按字典序生成排列,谁能证明一下啊。
    具体描述是,对A1,A2,...AN 寻找第一个Aj <A(j+1) 和A(j+1)>A(j+2)>A(j+3)>....A(n).寻找J+1到N中最小的大于Aj的元素,然后交换后对A(j+1)....An按升序排序。
      请教大侠一个证明
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dlyme
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 4

    发表于:2008-04-10 10:41:441楼 得分:0
    假设n个元素a(1) <a(2) <…… <a(n),
    最开始的序列一定是从a(1)a(2)……a(n)这个最小序列开始的(一定注意这一点,否则不能保证算法的正确性),
    到最后一个序列也是最大的a(n)a(n-1)……a(2)a(1)结束。

    按照你说的算法执行过程,任取中间两个相邻序列S[i]和S[i+1]
    需要证明两点才能保证这个过程是升序排列同时有没有遗漏:
    1.后面这个序列大于前面的相邻序列,即S[i+1]>S[i];
    2.后面的这个序列S[i+1]是“刚刚好大于”S[i]的序列。换句话说,S[i+1]是所有大于S[i]的序列中最小的那个。

    关于命题1:
    和整数类似,我们把序列看成从左往右由高位到低位,高位上被换上了一个更大的数字,显然新序列更大一些。
    关于命题2:
    假设还存在一个序列S[k]使得S[i] <S[k] <S[i+1],由于S[i]和S[i+1]中的1~j-1位完全相同,
    所以S[k]的前1~j-1位必定也是和S[i]中相同的,只需研究j~n这些低位数字就可以比较出三个序列的大小。
    将S[i]中的第j位数字记作a[i,j],S[i+1]中的第j位数字记作a[i+1,j],S[k]中的第j位数字记作a[k,j],
    由于1~j-1位完全相同,且S[i] <S[k] <S[i+1],显然有a[i,j] <=a[k,j] <=a[i+1,j]。
    又因为a[i+1,j]是“J+1到N中最小的大于Aj的元素”,那显然只能有a[k,j]=a[i+1,j]。
    于是比较S[k]与S[i+1]两个序列大小的问题,又转换成比较j+1~n这些低位数字的大小问题。
    S[k]与S[i+1]前1~j位都相同,由于S[i+1]后面的元素全都升序排列,所以只能有S[i+1] <=S[k]。
    这就得出了矛盾,因而前面的假设不可能成立,命题得证。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ksharp2008
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-04-10 11:19:282楼 得分:0
    又见大王,大王哪儿高就啊。真的很强啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ksharp2008
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-04-10 11:20:223楼 得分:0
    思维很紧密
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • medie2005
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

    发表于:2008-04-10 15:22:104楼 得分:0
    应该是很显然的事实啊,不需要证明吧。
    实质上就是进位规则,只是我们平时用10进制用惯了,不太容易看出来而已。
    数的进位规则:
    1):找最低的可增大的位k,增加之。
    2):将比k位低的位全清零。
    比如:099,显然,红色的0是最低的可增加的位,增加之,变为199;然后,将十位和个位清零,得到了100.
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved