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/