その他:古典的なアルゴリズムの不幸な豚

0まえがき

前の卵の落下の問題の次に、過去と新しいのレビューと見なすことができる古典的なアルゴリズムの問​​題に行きましょう。

さらに、これらのトピックは合理的であるために本当に興味深いです。それらは純粋に習熟度を練習することに関するものではありませんが、問題を見る方法を実際に行使する必要があります。

1.タイトルの説明

今回、458番目の問題に対応するLeetcodeにも含まれている「UnfortunatePig問題をていきます

次のように、リートコードでタイトルの説明を入力します。

有 buckets 桶液体,其中 正好 有一桶含有毒药,其余装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断。不幸的是,你只有 minutesToTest 分钟时间来确定哪桶液体是有毒的。

喂猪的规则如下:
1. 选择若干活猪进行喂养
2. 可以允许小猪同时饮用任意数量的桶中的水,并且该过程不需要时间。
3. 小猪喝完水后,必须有 minutesToDie 分钟的冷却时间。在这段时间里,你只能观察,而不允许继续喂猪。
4. 过了 minutesToDie 分钟后,所有喝到毒药的猪都会死去,其他所有猪都会活下来。
5. 重复这一过程,直到时间用完。

给你桶的数目 buckets ,minutesToDie 和 minutesToTest ,返回在规定时间内判断哪个桶有毒所需的最小猪数。

2.アルゴリズム分析

この質問は実際にはk-aryです。これについて考えることができれば、この質問は直接分析的に解決できます。

与えられたテスト時間でnラウンドの実験を行うことができると仮定します。だから、任意の豚のために、実際にそれは私にしてばかりいる+ 1の状態、持つことができますiithを私は死ぬ(i = 1 ... ni = 1 ... n=1 N-)またはエンド生存。

したがって、バケットの総数にはn + 1 n +1を使用するだけで済みます。n+これは底1で表され、その桁数は最終的に必要な豚の最小数です。

特に、n = 1 n = 1の場合n=1で、問題は最も単純なバイナリ問題に縮退します。

3.コードの実装

次のように、Pythonコードの実装を直接提供します。

class Solution:
    def poorPigs(self, buckets: int, minutesToDie: int, minutesToTest: int) -> int:
        k = minutesToTest // minutesToDie + 1
        return math.ceil(math.log(buckets) / math.log(k))

コード評価結果の提出:28ミリ秒かかり、提出された結果の98.28%を上回りました。

4.追記

この質問は、インタビューで実際に出会った数少ない質問の1つですが、残念ながら、当時ははっきりとは考えていませんでした。バイナリシステムに巻き込まれ、さらに一歩進んでk-に拡張することはできませんでした。残念ですが、今考えてみると、確かに問題です。非常に興味深いトピックです。今回はここに書いて、共有しましょう。

おすすめ

転載: blog.csdn.net/codename_cys/article/details/111397076