[问题] Sum of Three Values 使用杂凑表

楼主: nevikw39 (牧)   2021-08-15 01:53:49
各位电神安安 o'_'o
Sum of Three Values 应该算是很经典的题目,其简化版本 Sum of Two Values 常见的解
法有两种,分别是用杂凑表及 two pointer
有趣的是在 CSES 上使用 std::unordered_map 及 GNU PBDS 的 gp_hash_table 分别各有
一笔测资 TLE, 反而改用 BST 才 AC, 证实 log 只是常数 XD
回过头来看 Sum of Three Values, 我想同样有杂凑表与 three pointer 两种解法。
CSES 上 N <= 5000, 显然需要至少 O(N^2) 的解。
https://cses.fi/problemset/task/1641
这次试过 gp_hash_table, cc_hash_table, unordered_map 但测资 #21 始终过不了。
我也上网搜寻比较好的 hash function, 还是 TLE.
https://reurl.cc/4a05rY
把测资载下来研究,cc_hash_table 约十秒多,cc_hash_table + custom hash function
约七秒,cout IMPOSSIBLE 完直接 exit(0) 不管内存压到四秒多,BST 则是惨烈的三十
几秒
https://cses.fi/paste/25d625b68bc3c2b828e863/
但我的很好奇为何会这样??
明明 N 不过才 5000, 只做 12497500 次查询竟然要花上 4.3 秒!?
这笔测资到底有何神秘之处??其他同样 N = 5000 且无解的测资顶多跑个 0.1 秒而已。
实在找不到程式的瓶颈在哪,优化读 5000 个整数也只快零点零几秒。
想请教各位板友,这题是非用 three pointer 不可吗??可是我看 Sum of Four Values
好像还是用杂凑表耶。
还是 hash function 有什么改进之处??
感谢
作者: oToToT (屁孩)   2021-08-15 03:20:00
https://cses.fi/paste/a01de9d1338676682907de/ 可能CSESmemory 很慢? 我没仔细测,但随手写个一个这样会过https://cses.fi/paste/333b19bfd1af9e8f290804/ 帮你改成这样也会过,大概就是不要用那么多内存 (戳不存在的会帮创,但实际上你也没有想要用那些被创出来的东西)
楼主: nevikw39 (牧)   2021-08-15 10:20:00
了解惹,谢谢 oT 大原来是因为使用 [] 如果 key 不存在也会自动 insert 的细节

Links booklink

Contact Us: admin [ a t ] ucptt.com