Tag: 渐近复杂性

将数据存储为HashMap中具有空值/空值的键是个好主意吗?

我原来写了一个ArrayList并在其中存储了唯一的值(用户名,即Strings )。 我后来需要使用ArrayList来search用户是否存在。 这是O(n)的search。 我的技术负责人希望我将其更改为HashMap ,并将用户名作为键存储在数组中,并将值存储为空Strings 。 所以,在Java中 – hashmap.put("johndoe",""); 我可以看到这个用户以后是否存在运行 – hashmap.containsKey("johndoe"); 这是O(1)对不对? 我的领导说这是一个更有效的方式来做到这一点,这对我来说是有道理的,但是在hashmap中存储null / empty作为值并将其作为关键字存储在元素中似乎有点不合适。 我的问题是,这是一个好方法吗? 通常, ArrayList#contains的效率或数组search。 有用。 我的担心是,我没有看到任何人在search后做这个。 我可能在某个地方错过了一个显而易见的问题,但我看不到它。

把猫扔出窗外

想象一下,你正在一座带猫的高层build筑里。 猫可以从低矮的窗户里摔下来,但是如果从高处落下,它将会死亡。 如何用最less的尝试次数找出猫能够存活的最长时间? 显然,如果你只有一只猫,那么你只能线性search。 先从一楼扔掉猫。 如果它幸存下来,从第二个扔掉。 最后,从地板f扔掉后,猫会死亡。 然后你知道f-1楼是最大的安全楼层。 但是如果你有一只以上的猫呢? 你现在可以尝试某种对数search。 假设这个build筑有100层,你有两个相同的猫。 如果你把第一只猫从第50层扔出去,那么你只需要线性search50层。 如果您首次尝试select较低的楼层,则可以做得更好。 假设您select一次处理20个楼层的问题,而第一个致命楼层是#50。 在那种情况下,你的第一只猫在从第60层死亡之前将从第20层和第40层的飞行中幸存下来。你只需要单独检查第41层到第49层。 总共有12次尝试,比你试图使用二进制消除时需要的50次要好得多。 一般来说,最好的策略是什么,对于有两只猫的n层build筑来说,这是最糟糕的复杂性? 那么n层和m猫呢? 假设所有的猫都是相同的:它们都会从某个窗口的落下中生存或死亡。 而且,每一次尝试都是独立的,如果一只猫幸免于难,完全没有受到伤害。 这不是家庭作业,虽然我可能一旦解决了它的学校作业。 这只是一个突发奇想的问题,我今天突然想起,我不记得解决scheme。 如果有人知道这个问题或解决schemealgorithm的名称,奖励点。