Yinelenenlere * sahip olmadığınızı garanti ediyorsanız, genel olarak ve verimli bir şekilde çalışması gereken bir şey bulduğuma inanıyorum (ancak, herhangi bir sayıda delik ve herhangi bir tamsayı aralığına genişletilebilir olmalıdır).
Bu yöntemin arkasındaki fikir, çabuk sıralama gibidir, çünkü etrafında bir pivot ve bölüm buluyoruz, sonra yanlarda bir delikle çentik açıyoruz. Hangi tarafların deliğe sahip olduğunu görmek için en düşük ve en yüksek sayıları buluruz ve bunları o taraftaki pivot ve değer sayısı ile karşılaştırırız. Pivotun 17 ve minimum sayı 11 olduğunu varsayalım. Delik yoksa 6 sayı olmalıdır (11, 12, 13, 14, 15, 16, 17). Eğer 5 tane varsa, o tarafta bir delik olduğunu biliyoruz ve onu bulmak için sadece o tarafta geri çekilebiliriz. Bundan daha açık bir şekilde açıklamakta sorun yaşıyorum, o zaman bir örnek verelim.
15 21 10 13 18 16 22 23 24 20 17 11 25 12 14
Eksen:
10 13 11 12 14 |15| 21 18 16 22 23 24 20 17 25
Şekil 15, borular ( ||
) ile gösterilen pivottur . Pivotun sol tarafında 5 (10 - 10) ve sağda 9 (10 - 25 - 15) olması gereken 9 sayı vardır. Bu yüzden sağ tarafta çektik; deliğe bitişik olması durumunda önceki sınırın 15 olduğunu not edeceğiz (16).
[15] 18 16 17 20 |21| 22 23 24 25
Şimdi sol tarafta 4 sayı var ama 5 (21 - 16) olmalı. Bu yüzden oraya gidiyoruz ve yine önceki sınırı (parantez içinde) not edeceğiz.
[15] 16 17 |18| 20 [21]
Sol tarafta doğru 2 sayı (18 - 16) bulunur, ancak sağda 2 yerine 1 (20 - 18) vardır. Son koşullarımıza bağlı olarak, 1 sayısını iki tarafla (18, 20) karşılaştırabilir ve 19'un eksik olduğunu ya da bir kez daha tekrarladığını görebiliriz:
[18] |20| [21]
Sol taraf sıfır boyutuna sahiptir, pivot (20) ile önceki sınır (18) arasında bir boşluk vardır, bu nedenle 19 deliktir.
*: Çiftleri varsa, muhtemelen genel yöntem O (N) tutarak, O (N) zamanında bunları kaldırmak için bir karma kümesi kullanmak, ama bu belki başka bir yöntemi kullanarak daha fazla zaman alır.