新普金娱乐网址


功利性阅读:如何快速地用读书解决一个题目?

为经济学的意看在(连载二)

【译】数据展示:中国之程序员是世界上极度牛之程序员

  • 八月 30, 2018
  • 数学
  • 没有评论

率先声明一点,本文主要介绍的凡面向对象(OO)的合计,顺便说下函数式编程,而休是叫您哪些准确地、科学地用java求出函数在少数的导数。

写于前面:一直觉得中国的程序员想法多,肯钻研肯学习,但可休明白原来中国底程序员是社会风气上极牛的程序员。说来可能未信教,但因HackerRank官网的如出一辙首报道,数据展示中华之程序员就是世界上无与伦比牛之程序员。特将此文翻译成汉语,分享给大家。

 

设若问问哪里的程序员最牛,很多总人口肯定会认为是美国。毕竟美国有所广大一流之程序员,如比尔·盖茨、
肯·汤普森、 C
语言的大丹尼斯·里奇、唐纳德·克努特。但是,这些年,印度底程序员规模增长是世上最抢的,俄罗斯之黑客也越来越锋芒毕露。有啊艺术来确定谁国家的程序员是绝牛之吗?

一、引子

 

def d(f) :
    def calc(x) :
        dx = 0.000001  # 表示无穷小的Δx
        return (f(x+dx) - f(x)) / dx  # 计算斜率。注意,此处引用了外层作用域的变量 f
    return calc  # 此处用函数作为返回值(也就是函数 f 的导数)
# 计算二次函数 f(x) = x2 + x + 1的导数
f = lambda x : x**2 + x + 1  # 先把二次函数用代码表达出来
f1 = d(f)# 这个f1 就是 f 的一阶导数啦。注意,导数依然是个函数
# 计算x=3的斜率
f1(3)
# 二阶导数
f2 = d(f1)

第一,直接上平等段子python代码,请大家先分析下点代码是故啊方法求导的。请不要让当下段代码吓到,你管需纠结它的语法,只要知道她的求导思路。

上述代码引用自《呢底我推荐 Python[4]:作为函数式编程语言的
Python》,这首博客是促使自己勾勒篇稿子的严重性缘由。

博主说“如果非用 FP,改用 OOP,上述要求该怎么实现?俺当吧,用 OOP
来求导,这代码写起多半是以丑又丑。”

自己以信将疑,于是便用面向对象的java试了尝试,最后为无小代码。如果就此java8或者之后版本,代码更不见。

伸手大家想一个题材,如何用面向对象的思绪改写这个次。请预好好想想,尝试编个程序还累于下看。

设想到张是题目上的校友大多是仿照过java的,下面我用java,用面向对象的思绪一步步解析者问题。

 

当HackerRank网站上,哪些国家以编程挑战赛中见无与伦比厉害呢?通过数量,我们希望得以找到问题之答案。

二、求导

 

章开始我已临近声明了了,本文不是来讨论数学之,求导只是自所以来证明面向目标的一个例。

假若您早就忘记了开那段代码的求导思路,请回头再省,看看用python是什么求导的。

信任你如果听说了求导,肯定一眼便观望开头那段代码是为此导数概念求导的。

数学 1

代码中唯有是将无穷小Δx粗略地到底做一个较小之值0.000001。

 


HackerRank网站上,为了帮忙程序员提高技能,我们举行罢数以千计的编程挑战赛。来自世界各地成千上万的程序员参加了这些挑战赛,从
Python
到算法到安全及分布式系统都出涉嫌。我们的社区为闹超越150万开发者的排行,并且社区的口每天都于滋长。

老三、最初的想法

 

//自定义函数
public class Function {
    //函数:f(x) = 3x^3 + 2x^2 + x + 1
    public double f(double x) {
        return 3 * x * x * x + 2 * x * x + x + 1;
    }
}

//一元函数导函数
public class DerivedFunction {
    //表示无穷小的Δx
    private static final double DELTA_X = 0.000001;
    //待求导的函数
    private Function function;

    public DerivedFunction(Function function) {
        this.function = function;
    }

    /**
     * 获取function在点x处的导数
     * @param x 待求导的点
     * @return 导数
     */
    public double get(double x) {
        return (function.f(x + DELTA_X) - function.f(x)) / DELTA_X;
    }
}

public class Main {
    public static void main(String[] args) {
        //一阶导函数
        DerivedFunction derivative = new DerivedFunction(new Function());
        //打印函数在x=2处的一阶导数
        System.out.println(derivative.get(2));
    }
}

先期声明一点,考虑到博客篇幅,我以了无标准之代码注释,希望大家不用被我误导。

自想如果大家好考虑了,应该至少会想到马上步吧。代码我虽不讲了,我只是用java改写了章开始的那段python代码,做了一个简单易行的翻译工作。再请大家着想下以上代码的题材。

恰巧开头,我考虑是题目想开的是盖一个称吧Function的类似,类中生一个名为f的法子。但考虑到要每次要求新的函数导数时就是得改这个f方法的贯彻,明显不便于扩展,这违背了开闭原则。

估价有同学没有听罢这个词,我不怕分解下:”目标(类,模块,函数等)应本着扩大开放,但针对修改封闭“。

遂我不怕不曾累写下去,但为为大家直观的感想及这个想法,我形容这篇博客时即实现了一下这个想法。

请求大家想想一下怎么重构代码以解决扩展性问题。

 

冲我们的数展示,中国暨俄罗斯享有极其具才情的程序员。中国程序员在数学、功能程序设计与数据结构方面超越了世界其它国家之程序员,而俄罗斯程序员则在算法领域占据主导地位,算法也是最好风靡和极其具竞争力的圈子。虽然美国和印度于HackerRank上也生好多理想的程序员,但她俩呢只能排在第28暨第31。

季、初步的想法

 

估计学过面向对象的同学会想到将Function类改化接口或抽象类,以后每次上加新的函数时一旦还写这接口或抽象类中的f方法,这就算是面向接口编程,符合仰反转原则,下面的代码就是如此做的。

又声明一点,考虑到篇幅的问题,后面的代码我会省去与前代码重复的诠释,有未晓的地方还请求看上一个想法中的代码。

//一元函数
public interface Function {
    double f(double x);
}

//自定义的函数
public class MyFunction implements Function {
    @Override
    public double f(double x) {
        return 3 * x * x * x + 2 * x * x + x + 1;
    }
}

public class DerivedFunction {
    private static final double DELTA_X = 0.000001;
    private Function function;

    public DerivedFunction(Function function) {
        this.function = function;
    }

    public double get(double x) {
        return (function.f(x + DELTA_X) - function.f(x)) / DELTA_X;
    }
}

public class Main {
    public static void main(String[] args) {
        //一阶导函数:f'(x) = 9x^2 + 4x + 1
        DerivedFunction derivative = new DerivedFunction(new MyFunction());
        System.out.println(derivative.get(2));
    }
}

自身思认真看之同桌也许会见发觉一个题目,我之翻做的还无完了,开头那段python代码还可轻松地央求出二阶导函数(导数的导数),而自我的代码却不行。

实际上只要稍加修改上述代码的一个地方便足以轻松实现求其次阶导,请复思索片刻。

 

1、整体综合排名

我们先行由程序员中极度让欢迎之测试类开始分析。HackerRank程序员可摘与15个不等世界,下表显示了各个领域的比重

数学 2
遥远领先的园地是算法领域,这个小圈子得到了贴近40%之程序员青睐。这个圈子包括数据排序,动态编程,搜索关键字与其它根据逻辑的任务点的挑战。对于算法测试,程序员可下他们捎的言语,这恐怕吧说明了拖欠领域如此给欢迎的片段原因。排在其次员与老三员的Java和数目架构分别都占到了近乎
10%之比例。而分布系统以及平安之占有比较低。

这就是说,基于这些测试,哪个国家的程序员整体得分最高也?

为来明白,我们查阅了逐条国家所于领域的平均得分。计算平均得分前我们还要也每个领域制订了打分标准(通过自每个分数减去平均值,然后除以标准各异,也称为z分数),这样的话,即使每个领域的难度来反差,但咱吧会针对不同世界的私家打分,并摇身一变于总体到个人之可比系统。为了吃结果再次直观,我们根据
z 分数框架的规律,做了一个 1-100 分数框架来说明。

我们统计了 HackerRank 上程序员最多之 50 只邦,得出下面就张表单:
数学 3
鉴于中国之程序员得分最高,所以将中国底分数作为 100
的基准分,则俄罗斯之分为 99.9 ,两国单独相距 0.01 。另外,波兰同瑞士为坐
98 的过人分入前列。巴基斯坦得分就为 57.4 。

印度以及美国啊世界贡献了极度多之程序员,但从未进入榜单的前 25称作 ,只分级以
76 和 78 的分数排名 31 和 28 。

五、后来之想法

 

当我形容有点的代码时,我感觉到了可以矢口否认“用 OOP
来求导,这代码写起多半是同时可恨又可恨”的见识。但尚免可知请其次阶导,我起接触不甘心。

于是乎我虽动笔,列了一晃用定义求一阶导和求二阶导的姿态,想了纪念少只相的别与沟通,突然想到导函数也是函数。

DerivedFunction的get方法及Function的f方法的参数与返回值一样,DerivedFunction可以实现Function接口,于是发了下面的代码。

public interface Function {
    double f(double x);
}

public class DerivedFunction implements Function {
    private static final double DELTA_X = 0.000001;
    private Function function;

    public DerivedFunction(Function function) {
        this.function = function;
    }

    @Override
    public double f(double x) {
        return (function.f(x + DELTA_X) - function.f(x)) / DELTA_X;
    }
}

public class Main {
    public static void main(String[] args) {
        Function f1 = new DerivedFunction(new Function() {
            @Override
            public double f(double x) {
                return 3 * x * x * x + 2 * x * x + x + 1;
            }
        });
        System.out.println(f1.f(2));
        //二阶导函数:f''(x) = 18x + 4
        Function f2 = new DerivedFunction(f1);
        //打印函数f(x) = 3x^3 + 2x^2 + x + 1在x=2处的二阶导数
        System.out.println(f2.f(2));
    }
}

考虑到有些同学没有学过java8要上述版本,以上代码没有利用java8套数式编程的初特色。 

假如您点过java8,请考虑什么改写以上代码,使该重新简洁。

 

2、特定领域排名

虽说中国之行特别突出,但为非特是雄霸所有榜单。哪个国家的程序员在一定领域的变现最好?我们来看望各个领域中上榜的国。
数学 4
可看看中国于有些世界相当美好。中国程序员在当数据结构、数学与函数式编程方面打败了另外国家之程序员。另外,俄罗斯程序员在挑战举办最多之算法领域呢选择得桂冠。其次是个别处于第二、第三岗位的波兰与中国。

岂解释不同国度于不同世界的品位距离?有或是因俄罗斯的程序员更欣赏到算法类的比,也不怕见面在当时同天地投入还多精力,而大多数华夏程序员则另行爱好涉足数据结构类的色。

在HackerRank工作之一个软件工程师就是这样的,他为Shimi
Zhang,是咱函数型编程领域排名前十个之程序员之一。他来华夏重庆市,两年前至美国就学计算机科学硕士,然后至HackerRank工作。

发源中国底超级程序员Shimi
Zhang就中国程序员的别致之处在达了他的见:

“和任何国家对待,中国的高档教育资源比较少,中国之小伙学习编程的路途自就狭窄。很多非同一般的年轻人当取来之不易的变成比,会真正痴迷于之。

于中华,很多后生当中学时代即开进修编程了,甚至还品尝解决的一对在全世界也从来不小人口会缓解之难题。

设立专门针对年轻人工程师的全国性比赛,如 NOIp (
全国青少年信息学奥林匹克联赛)和 NOI (
全国青年信息学奥林匹克竞赛),今年起码发生 3 个人在 NOI
中又获得了冠军。这种针对青少年做的编程比赛是靠近十年内的矛头。

又, NOI 中还有一个牛逼的专门规定:如果同样各项选手在 NIO
中获了金牌,他即使不能够到国际信息学奥林匹克竞赛的中国队选拔赛,这就意味着,在列国信息学奥林匹克竞赛被赢得金牌的中国运动员,都是首战告捷。”

六、最后的想法

 

public class DerivedFunction implements Function<Double, Double> {
    private static final double DELTA_X = 0.000001;
    private Function<Double, Double> function;

    public DerivedFunction(Function<Double, Double> function) {
        this.function = function;
    }

    @Override
    public Double apply(Double x) {
        return (function.apply(x + DELTA_X) - function.apply(x)) / DELTA_X;
    }
}

public class Main {
    public static void main(String[] args) {
        //打印函数在x=2处的二阶导
        System.out.println(new DerivedFunction(new DerivedFunction(x -> 3 * x * x * x + 2 * x * x + x + 1)).apply(2.0));
    }
}

事先几乎个想法为了扩大Function接口,使用了表面类、匿名类的法子,其实也足以为此其中类。而立当此处,我之所以了lambda表达式,是勿是再次简洁了。

这边用之Function接口用的凡jdk自带的,我们无待自己定义了。因为当时是一个函数式接口,我们好为此lambda方便地落实。后来意识,其实这里用UnaryOperator这接口更合适。

如今大家发没有来发现,用java、用OOP也得老简短地落实求导,并无可比初步的那段python代码麻烦大多。

 

3、不同国度程序员的宠爱

连着下去,我们还要比较了每个国家程序员在不同挑战赛上消费的时日,然后和HackerRank用户平均消费的时长进行比较。这样一来,就会检索来不同国度程序员在特定领域的偏好了。
数学 5
一旦上表所示,中国程序员在数学竞赛中之涉企度远远超乎我们预料的平均水平,这即能够说明为什么他们能于这个世界高踞榜首了。捷克总人口似的很欢喜
shell,在斯单项他们是率先。

七、编程范式

 

在我看来,编程范式简简单单的话就是是编程的同一栽模式,一种植风格。

本身事先介绍其中的老三只,你多就是掌握其的意思了。

 

4、不同国家程序员的编程语言偏好

但除了就半只邦,其它国家的选料偏好与擅长领域接近并不曾必然联系。我们为想掌握其他国家的程序员对特定的编程语言是否发特嗜好。比如印度数学程序员是无是对准C++更感谢兴趣?墨西哥程序员是勿是都用Ruby编码?
数学 6

看来,世界各地的程序员选用 Java
的百分比还如过其它语言(只有极少数之异:如马来西亚及巴基斯坦底程序员更爱好
C++,台湾的程序员更欣赏 Python
)。而斯里兰卡程序员也是JAVA比例以高的国家,在HackerRan中吗行排在第八底职务。

巴基斯坦、斯里兰卡同尼日利亚脚下行在低端,他们可学学上瑞士底定性。程序员在HackerRank社区上并未使劲就放弃了挑战,得分也零星。瑞士的零记分用户比例是低于,瑞士程序员也可谓称得达世界上极烈的程序员。

实际上对世界各地的程序员来说,无论你自哪儿,都发出或变为一下单盖茨或者克努特。

因这些数量,如果我们办平场黑客奥林匹克竞赛,中国拿获取金牌,俄罗斯拿收获银牌,而波兰虽然拿下铜牌。尽管美国暨印度的程序员让人值得称赞,但想上前面25,还是待再累努力的。

翻的情比较多,如发一部分语句措辞不当的,欢迎指出。

原文出处:https://blog.hackerrank.com/which-country-would-win-in-the-programming-olympics/

数学 7

7.1 面向对象程序设计(OOP)

目这里的同班应该对面向对象有了双重直观的认。在面向对象编程中,万物皆对象,抽象出类的概念。基本特性是包装、继承、多态,认识不要命的同班可以还失我前的代码中追寻找就三个性状。

自己事先还介绍了面向对象的几独规范:开闭原则、凭反转原则。其他还有单纯性任务规范、里氏替换原则、接口隔离原则。这是面向对象的5单着力尺度,合称SOLID)。

 

7.2 函数编程语言(FP)

正文开头那段代码用底就是是python函数式编程的语法,后来我以因故java8套数式编程的语法翻译了就段代码。

深信不疑你都直观地感受及它们的简练,以函数为着力,几行代码就迎刃而解了求导的题材。

 

7.3 过程式编程(Procedural programming)

横学了编程都仿效过C,C语言就是一律栽过程式编程语言。在我看来,过程式编程大概就是是为了做到一个需求,像记流水帐一样,平铺直叙下去。 

       

八、结尾

 

出于我初学java,目前只能想到这样多。如果大家产生双重好的想法或觉的本人面说的产生题目,欢迎评论,望各位不吝赐教。

立马是自我之首先篇技术博客,但愿自己说清楚了面向对象。如果对而产生帮带,请点个赞或者评论下,给本人沾持续写之动力。

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图