• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 关于数组乱序后的两个问题?

关于数组乱序后的两个问题?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了数组乱序,js数组乱序,php 数组乱序,java数组乱序,数组乱序方法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:关于数组乱序后的两个问题?
描述:

题目:
编写一个程序ShuffleTest,接受命令行参数M 和N,将大小为M 的数组打乱N 次且在每次打乱之前都将数组重新初始化为a[i] = i。打印一个M×M 的表格,对于所有的列j,行i 表示的是i 在打乱后落到j 的位置的次数。数组中的所有元素的值都应该接近于N/M。
(题目来自《算法》练习题第1.1.36,下面中的部分代码用到该书中的stdlib.jar)
问题在代码的注释中:

javapublic class quiz_1_1_36 {
    public static int[] shuffle(int[] a) {
        int N = a.length;
        for (int i = 0; i < N; i++) {
            int r = i + StdRandom.uniform( N - i );      //随机产生一个(i, N)之间的数r
            int temp = a[i];
            a[i] = a[r];
            a[r] = temp;
        }
        return a;
    }
    public static void shuffleTest(int m, int n) {
        int [][] s = new int[m][m];

        for(int k = 0; k < n; k++) {   
            //初始化数组
            int[] a = new int[m];
            for (int i = 0; i < m; i++) {
                a[i] = i;
            }
            //打乱数组
            shuffle(a);
            //问题: i在打乱后落在j的位置上的次数??
            //对于题目的这个要求看的不是很明白,行i表示的是i在打乱后落到j的位置的次数该怎样实现?

        }
        //输出
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < m; j++) {
                StdOut.printf("%7d", s[i][j]);
            }
            StdOut.println();
        }
        //问题: 怎样检查数组中的所有元素的值都应该接近于N/M ??
        //用循环把每个数组中每个值遍历下,那怎么判定接近?

    }
    public static void main(String[] args) {
        int m = Integer.parseInt(args[0]);
        int n = Integer.parseInt(args[1]);

        shuffleTest(m, n);
    }
}

下面这个是实现题目要求的程序(来自:这里),但是程序中的两个部分不懂,如下:

javapublic class quiz_1_1_36
{
    public interface IShuffle        //问题:这个作用是什么?
    {
        public void shuffle(int[] a);     
    }

    public static void ShuffleTest(IShuffle shuffle, int m, int n)     //问题:第一个参数是干嘛用的?
    {
        int[][] s = new int[m][m];

        for (int k = 0; k < n; k++)
        {
            int[] a = new int[m];
            for (int i = 0; i < m; i++)
                a[i] = i;

            shuffle.shuffle(a);

            for (int i = 0; i < m; i++)
             //这里是实现行i 表示的是i 在打乱后落到j 的位置的次数,
                s[i][a[i]]++;   
        }

        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < m; j++)
                StdOut.printf("%7d", s[i][j]);
            StdOut.println();
        }
    }

    public static void main(String[] args)
    {
        int m = Integer.parseInt(args[0]);
        int n = Integer.parseInt(args[1]);

        //问题:这段这样写是什么意思??
        //----
        IShuffle shuffle = new IShuffle()
        {
            public void shuffle(int[] a)
            {
                StdRandom.shuffle(a);   //调用《算法》中的stdlib.jar中的StdRandom库中的随机将元素排序方法
            }
        };
        //------
        ShuffleTest(shuffle, m, n);
    }
}

用10 50做参数测试,运行后发现,貌似也没有实现检测数组中的所有元素的值都应该接近于N/M。


解决方案1:

定义 IShuffle 这个接口的目的是为了将“打乱”这个操作包装起来。整个程序的逻辑,归结起来分为两部分:1、打乱数组;2、对打乱结果进行统计。 ShuffleTest() 方法将前者包装成一个接口,这样该方法自身就突出了后者的逻辑,整个代码更加容易看懂。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 关于数组乱序后的两个问题?

相关文章

  • 2017-06-07 七牛云存储中的数据库处理功能支持扩展么?
  • 2017-06-07 python进制转换问题?
  • 2017-06-07 哪位高手帮忙看下这些代码是什么功能
  • 2017-06-07 (python)beautifulSoup4select'bnrName'取不到到text文字
  • 2017-06-07 api支付接口英雄联盟中文api接口
  • 2017-06-07 Javascript模板引擎和框架(MVC)有什么区别?
  • 2017-06-07 正则表达式求正则表达式
  • 2017-06-07 python爬虫python查询结果总有个u字符???
  • 2017-06-07 python如何用ctypes调用大恒sdk下的dll?(有很多的dll文件)
  • 2017-06-07 大家推荐个在网上接活的网站撒!!

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 如何用C实现这样一个索引算法?
    • OSX中的Amethyst应用如何保存配置?
    • Shell脚本程序设计
    • 用户排名算法在网站中如何具体实现?
    • 如何将二维数组传入二维指针中?
    • 求windows2000源码
    • 七牛云视频转码使用“avthumb/mp4",如果源文件也是MP4,会执行转码操作吗?
    • vba可以调用java的class文件执行吗?
    • 求助:关于opencl中CPU和GPU对double的计算问题
    • (shell)linux如何根据文件的最后改动时间进行定时备份?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有