Google Hash Code 2017 - UniBg · 2020. 11. 17. · Google Hash Code What is it? How does it work?...
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/