Google Hash Code 2017 - UniBg · 2020. 11. 17. · Google Hash Code What is it? How does it work?...

43
Google Hash Code 2017 UniBG - 08 / 02 / 2017 seclab.unibg.it

Transcript of Google Hash Code 2017 - UniBg · 2020. 11. 17. · Google Hash Code What is it? How does it work?...

  • Google Hash Code 2017

    UniBG - 08 / 02 / 2017seclab.unibg.it

    http://seclab.unibg.it/http://seclab.unibg.it/

  • Google Hash Code

    ● What is it?

    ● How does it work?○ Team composed by 2-4 members

    ○ It’s necessary to register the team and then join the hub

    ○ Divide tasks between team members (parsing, output, algorithm, …)

    ● The perfect solution is not necessary (does not exist?)

    ● You must optimize○ Find a way to maximize/minimize a goal function

    ● Several techniques○ Dynamic Programming with approximations

    ○ Greedy Algorithms (choose the local optimal choice)

  • Dynamic Programming - a gentle introduction -

  • 1

    12

    3 5

    813

    2134

  • Problem:

    Compute Fibonacci forN OVER 9000!

  • static int fibonacci_1(int n)

    1. static int fibonacci_1(int n) {

    2. System.out.println("computing " + n);

    3. if (n

  • main

    1. public static void main(String[] args) {

    2. Scanner sc = new Scanner(System.in);

    3. int n = sc.nextInt();

    4. System.out.println(fibonacci_1(n));

    5. }

  • Ok, let’s try with 6

    computing 6computing 5computing 4computing 3computing 2computing 1computing 2computing 3computing 2computing 1computing 4computing 3computing 2computing 1computing 28

    6

  • Successione di Fibonacci - Stack delle chiamate

  • 6 works, let’s try 100!

    computing 100computing 99computing 98………computing 99……computing 98 ………

    5 minutes later

    Not yet finished

    100

  • Successione di Fibonacci - Dynamic Programming

  • static int fibonacci_2(int n)

    1. static Map cache_2 = new HashMap();

    2.

    3. static Integer fibonacci_2(int n) {

    4. if (cache_2.containsKey(n))

    5. return cache_2.get(n);

    6.

    7. System.out.println("computing " + n);

    8. int result;

    9.

    10. if (n

  • What about 100 now?

    computing 100computing 99computing 98computing 97computing 96computing 95…computing 5computing 4computing 3computing 2computing 1-980107325

    100

  • static BigInteger fibonacci_3(int n)

    1. static Map cache_3 = new HashMap();

    2.

    3. static BigInteger fibonacci_3(int n) {

    4. if (cache_3.containsKey(n))

    5. return cache_3.get(n);

    6.

    7. System.out.println("computing " + n);

    8. BigInteger result;

    9.

    10. if (n

  • Let’s make fibonacci great again!

    computing 100computing 99computing 98computing 97computing 96computing 95…computing 5computing 4computing 3computing 2computing 1354224848179261915075

    100

  • GO BIG!

    computing 1000computing 999computing 998computing 997computing 996computing 995…computing 5computing 4computing 3computing 2computing 143466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875

    1000

  • GO BIIIIIIIIIIIIIIIIIIG!

    computing 10000computing 9999computing 9998computing 9997computing 9996computing 9995…computing 4471

    Exception in thread "main" java.lang.StackOverflowError … at com.company.Main.fibonacci_3

    10000

  • Stack Overflow? Let’s increase the Stack Size!

    just leave a bit of memory for the system,

    But don’t fear to go to gigabytes!

  • GO BIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIGGG!!111

    computing 10000computing 9999computing 9998computing 9997computing 9996computing 9995…computing 5computing 4computing 3computing 2computing 1

    10000

  • GO BIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIGGG!!111

    33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812206564914032751086643394517512161526545361333111314042436854805106765843493523836959653428071768775328348234345557366719731392746273629108210679280784718035329131176778924659089938635459327894523777674406192240337638674004021330343297496902028328145933418826817683893072003634795623117103101291953169794607632737589253530772552375943788434504067715555779056450443016640119462580972216729758615026968443146952034614932291105970676243268515992834709891284706740862008587135016260312071903172086094081298321581077282076353186624611278245537208532365305775956430072517744315051539600905168603220349163222640885248852433158051534849622434848299380905070483482449327453732624567755879089187190803662058009594743150052402532709746995318770724376825907419939632265984147498193609285223945039707165443156421328157688908058783183404917434556270520223564846495196112460268313970975069382648706613264507665074611512677522748621598642530711298441182622661057163515069260029861704945425047491378115154139941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875

  • static BigInteger fibonacci_4(int n)

    1. static Map cache_4 = new HashMap();

    2.

    3. static BigInteger fibonacci_4(int n) {

    4.

    5. Function fn = new Function() {

    6. @Override

    7. public BigInteger apply(Integer x) {

    8. if (x

  • aaaand it’s done !

    of course one should not use recursion for Fibonacci, but a loop… anyway…

    1. static BigInteger fibonacci_5(int n) {

    2. BigInteger a = BigInteger.ONE, b = BigInteger.ONE, next;

    3. for (int i = 2; i < n; i++) { next = a.add(b); a = b; b = next; }

    4. return b;

    5. }

  • What about libraries?

    ● The first rule of Java Club is: use maven

    ● The second rule of Java Club is: USE MAVEN

    Useful Java Libraries:

    ● Fastutil https://github.com/vigna/fastutil● ND4J http://nd4j.org/● Guava https://github.com/google/guava

    https://github.com/vigna/fastutilhttp://nd4j.org/https://github.com/google/guava

  • How do I learn?

    https://hackerrank.com

    https://hackerrank.comhttps://hackerrank.com

  • seclab.unibg.it

    http://seclab.unibg.it/http://seclab.unibg.it/

  • one more thing ...

  • https://hashcodejudge.withgoogle.com

    https://hashcodejudge.withgoogle.comhttps://hashcodejudge.withgoogle.com

  • Unibg Seclab - Practice problem internal competition

    The team that submits the highest scores for the practice problem gets free pizza during the competition.

    =>

  • seclab.unibg.it

    http://seclab.unibg.it/http://seclab.unibg.it/