ค้นหาค่ามัธยฐานที่ใช้งานอยู่จากกระแสของจำนวนเต็ม


223

ซ้ำเป็นไปได้:
อัลกอริทึมค่ามัธยฐานกลิ้งใน C

ระบุว่าจำนวนเต็มอ่านจาก data stream ค้นหาค่ามัธยฐานขององค์ประกอบที่อ่านได้อย่างมีประสิทธิภาพ

วิธีแก้ปัญหาที่ฉันได้อ่าน: เราสามารถใช้สูงสุดกองด้านซ้ายเพื่อเป็นตัวแทนองค์ประกอบที่น้อยกว่าค่ามัธยฐานที่มีประสิทธิภาพและกองต่ำสุดทางด้านขวาเพื่อเป็นตัวแทนองค์ประกอบที่มากกว่าค่ามัธยฐานที่มีประสิทธิภาพ

หลังจากประมวลผลองค์ประกอบที่เข้ามาจำนวนขององค์ประกอบในกองแตกต่างกันมากที่สุด 1 องค์ประกอบ เมื่อทั้งสองฮีปมีจำนวนองค์ประกอบเท่ากันเราจะพบว่าค่าเฉลี่ยของข้อมูลรูทของฮีปนั้นเป็นค่ามัธยฐานที่มีประสิทธิภาพ เมื่อฮีปไม่สมดุลเราจะเลือกค่ามัธยฐานที่มีประสิทธิภาพจากรูทฮีปที่มีองค์ประกอบมากกว่า

แต่เราจะสร้าง heap สูงสุดและ heap สูงสุดได้อย่างไรเราจะรู้ค่ามัธยฐานที่มีประสิทธิภาพได้อย่างไร ฉันคิดว่าเราจะแทรก 1 องค์ประกอบใน max-heap แล้วองค์ประกอบ 1 ถัดไปใน min-heap และอื่น ๆ สำหรับองค์ประกอบทั้งหมด ถูกต้องฉันถ้าฉันผิดที่นี่


10
อัลกอริทึมที่ฉลาดโดยใช้ฮีป จากชื่อฉันไม่สามารถคิดทางออกได้ทันที
Mooing Duck

1
ทางออกของอัครมหาเสนาบดีดูดีสำหรับฉันยกเว้นว่าฉันคิดว่า (แม้ว่าคุณไม่ได้ระบุ) ว่ากระแสนี้อาจยาวโดยพลการดังนั้นคุณจึงไม่สามารถเก็บทุกอย่างไว้ในความทรงจำ เป็นอย่างนั้นเหรอ?
ใช้งาน Wild

2
@RunningWild สำหรับสตรีมแบบยาวโดยพลการคุณสามารถรับค่ามัธยฐานขององค์ประกอบ N สุดท้ายโดยใช้ Fibonacci heaps (เพื่อให้คุณได้รับการลบ log (N)) และจัดเก็บพอยน์เตอร์ไปยังองค์ประกอบที่แทรกตามลำดับ (เช่น deque) องค์ประกอบในแต่ละขั้นตอนเมื่อกองเต็ม (อาจย้ายสิ่งของจากกองหนึ่งไปอีกกองหนึ่ง) คุณสามารถทำได้ดีกว่า N โดยเก็บจำนวนองค์ประกอบซ้ำ ๆ (ถ้ามีจำนวนซ้ำ) แต่โดยทั่วไปฉันคิดว่าคุณต้องตั้งสมมุติฐานการกระจายบางอย่างถ้าคุณต้องการค่ามัธยฐานของกระแสทั้งหมด
Dougal

2
คุณสามารถเริ่มด้วย heaps ว่างทั้งคู่ int แรกไปในหนึ่งกอง ส่วนที่สองไปในอีกด้านหนึ่งหรือคุณย้ายรายการแรกไปที่ฮีปอื่นแล้วแทรก วิธีนี้ทำให้ "ไม่อนุญาตให้ฮีปหนึ่งฮีพมีขนาดใหญ่กว่า +1 อื่น ๆ " และไม่จำเป็นต้องใช้ปลอกพิเศษ ("ค่ารูท" ของฮีปเปล่าสามารถกำหนดเป็น 0 ได้)
Jon Watte

ฉันแค่ได้รับคำถามนี้ในการสัมภาษณ์ MSFT ขอบคุณสำหรับการโพสต์
R Claven

คำตอบ:


383

มีวิธีแก้ปัญหาที่แตกต่างกันจำนวนหนึ่งสำหรับการค้นหาค่ามัธยฐานจากการสตรีมข้อมูลฉันจะพูดคุยสั้น ๆ เกี่ยวกับพวกเขาในตอนท้ายของคำตอบ

คำถามเกี่ยวกับรายละเอียดของโซลูชันเฉพาะ (สูงสุด heap / min heap solution) และวิธีการทำงานของ heap based solution อธิบายไว้ด้านล่าง:

สำหรับองค์ประกอบสองรายการแรกเพิ่มขนาดเล็กลงหนึ่งใน maxHeap ด้านซ้ายและใหญ่กว่าไปยัง minHeap ทางด้านขวา จากนั้นประมวลผลสตรีมข้อมูลทีละรายการ

Step 1: Add next item to one of the heaps

   if next item is smaller than maxHeap root add it to maxHeap,
   else add it to minHeap

Step 2: Balance the heaps (after this step heaps will be either balanced or
   one of them will contain 1 more item)

   if number of elements in one of the heaps is greater than the other by
   more than 1, remove the root element from the one containing more elements and
   add to the other one

จากนั้นในเวลาใดก็ตามคุณสามารถคำนวณค่ามัธยฐานเช่นนี้:

   If the heaps contain equal amount of elements;
     median = (root of maxHeap + root of minHeap)/2
   Else
     median = root of the heap with more elements

ตอนนี้ฉันจะพูดถึงปัญหาโดยทั่วไปตามที่สัญญาไว้ในตอนต้นของคำตอบ การค้นหาค่ามัธยฐานที่ใช้งานจากสตรีมข้อมูลเป็นปัญหาที่ยากและการหาโซลูชันที่แน่นอนพร้อมกับข้อ จำกัด ของหน่วยความจำอย่างมีประสิทธิภาพอาจเป็นไปไม่ได้สำหรับกรณีทั่วไป ในทางกลับกันหากข้อมูลมีลักษณะบางอย่างที่เราสามารถใช้ประโยชน์ได้เราสามารถพัฒนาโซลูชั่นเฉพาะที่มีประสิทธิภาพ ตัวอย่างเช่นถ้าเรารู้ว่าข้อมูลเป็นประเภทที่สมบูรณ์เราสามารถใช้การเรียงลำดับการนับได้ซึ่งสามารถให้อัลกอริทึมเวลาคงที่ของหน่วยความจำคงที่แก่คุณได้ โซลูชันแบบอิงฮีปคือโซลูชันทั่วไปที่มีความหลากหลายกว่าเนื่องจากสามารถใช้กับชนิดข้อมูลอื่น ๆ (คู่) ได้เช่นกัน และสุดท้ายถ้าไม่จำเป็นต้องมีค่ามัธยฐานที่แน่นอนและการประมาณก็เพียงพอแล้วคุณสามารถลองประมาณฟังก์ชันความหนาแน่นของความน่าจะเป็นสำหรับข้อมูลและประเมินค่ามัธยฐานโดยใช้สิ่งนั้น


6
ฮีปเหล่านี้เติบโตขึ้นโดยไม่มีข้อ จำกัด (เช่นหน้าต่างองค์ประกอบ 100 บานเลื่อนกว่า 10 ล้านองค์ประกอบจะต้องใช้องค์ประกอบ 10 ล้านองค์ประกอบทั้งหมดในหน่วยความจำ) ดูด้านล่างสำหรับคำตอบอื่นโดยใช้นักทำดัชนีที่สามารถจัดทำดัชนีซึ่งต้องการเพียง 100 องค์ประกอบที่เห็นล่าสุดเท่านั้นที่จะถูกเก็บไว้ในหน่วยความจำ
Raymond Hettinger

1
คุณสามารถมีโซลูชันหน่วยความจำที่มีขอบเขตโดยใช้ heap เช่นกันตามที่อธิบายไว้ในความคิดเห็นข้อใดข้อหนึ่งของคำถาม
Hakan Serce

1
คุณสามารถค้นหาการใช้งานโซลูชันแบบอิงฮีปได้ที่นี่
AShelly

1
ว้าวสิ่งนี้ช่วยฉันไม่เพียง แต่จะแก้ปัญหาเฉพาะนี้เท่านั้น แต่ยังช่วยให้ฉันเรียนรู้ฮีปนี่คือการใช้งานพื้นฐานของฉันในไพ ธ อน: github.com/PythonAlgo/DataStruct
swati saoji

2
@HakanSerce คุณช่วยอธิบายได้ไหมว่าทำไมเราถึงทำในสิ่งที่เราทำ? ฉันหมายถึงฉันเห็นผลงานนี้ แต่ฉันไม่สามารถเข้าใจได้โดยสังหรณ์ใจ
พระอิศวร

51

หากคุณไม่สามารถเก็บรายการทั้งหมดในหน่วยความจำได้ในคราวเดียวปัญหานี้จะยากขึ้นมาก โซลูชันฮีปต้องการให้คุณเก็บองค์ประกอบทั้งหมดในหน่วยความจำพร้อมกัน สิ่งนี้เป็นไปไม่ได้ในแอปพลิเคชันส่วนใหญ่ในโลกแห่งปัญหา

แต่ในขณะที่คุณเห็นตัวเลขให้ติดตามการนับจำนวนครั้งที่คุณเห็นจำนวนเต็มแต่ละค่า สมมติว่าเป็นจำนวนเต็ม 4 ไบต์นั่นคือ 2 ^ 32 ที่เก็บข้อมูลหรืออย่างน้อย 2 ^ 33 จำนวนเต็ม (คีย์และนับสำหรับแต่ละ int) ซึ่งคือ 2 ^ 35 ไบต์หรือ 32GB มันอาจจะน้อยกว่านี้มากเพราะคุณไม่จำเป็นต้องเก็บคีย์หรือนับสำหรับรายการเหล่านั้นที่เป็น 0 (เช่น. เช่น defaultdict เป็นไพ ธ อน) การดำเนินการนี้ใช้เวลาคงที่เพื่อแทรกจำนวนเต็มใหม่แต่ละค่า

จากนั้น ณ จุดใดก็ได้เพื่อหาค่ามัธยฐานเพียงใช้การนับเพื่อพิจารณาว่าจำนวนเต็มใดเป็นองค์ประกอบกลาง ใช้เวลาคงที่ (แม้ว่าจะเป็นค่าคงที่ที่มีขนาดใหญ่ แต่ค่าคงที่ยังคงอยู่)


3
หากตัวเลขเกือบทั้งหมดเห็นครั้งเดียวมากกว่ารายการที่กระจัดกระจายจะใช้หน่วยความจำมากขึ้น และดูเหมือนว่าค่อนข้างเป็นไปได้ว่าหากคุณมีตัวเลขจำนวนมากพวกเขาจะไม่พอดีกับจำนวนที่ตัวเลขส่วนใหญ่จะปรากฏขึ้นหนึ่งครั้ง ไม่สนใจว่านี่เป็นคำตอบที่ชาญฉลาดสำหรับการนับจำนวนมหาศาล
Mooing Duck

1
สำหรับรายการที่กระจัดกระจายฉันยอมรับว่านี่เป็นเรื่องที่แย่กว่าในแง่ของความจำ แม้ว่าจำนวนเต็มจะถูกกระจายแบบสุ่มคุณจะเริ่มได้รับข้อมูลซ้ำเร็วกว่าที่บอกไว้ ดูmathworld.wolfram.com/BirthdayProblem.html ดังนั้นฉันค่อนข้างแน่ใจว่าจะมีผลทันทีที่คุณมีข้อมูลไม่กี่ GB
แอนดรู C

4
@AndrewC คุณสามารถอธิบายวิธีการใช้เวลาคงที่เพื่อหาค่าเฉลี่ย หากฉันได้เห็นจำนวนเต็มชนิดที่แตกต่างกันแล้วในกรณีที่เลวร้ายที่สุดองค์ประกอบสุดท้ายอาจเป็นค่ามัธยฐาน สิ่งนี้ทำให้ค่ามัธยฐานการหากิจกรรม O (n)
shshnk

@shshnk ไม่ใช่องค์ประกอบทั้งหมดซึ่งคือ >>> 2 ^ 35 ในกรณีนี้ใช่ไหม
VishAmdi

@shshnk คุณพูดถูกว่ามันยังคงเป็นเชิงเส้นในจำนวนเต็มที่คุณเคยเห็นตามที่ VishAmdi กล่าวว่าข้อสมมุติที่ฉันทำกับวิธีนี้คือ n คือจำนวนตัวเลขที่คุณเห็นซึ่งมาก ใหญ่กว่า 2 ^ 33 หากคุณไม่เห็นตัวเลขจำนวนมากโซลูชัน maxheap จะดีกว่าแน่นอน
Andrew C

49

หากความแปรปรวนของข้อมูลมีการกระจายทางสถิติ (เช่นปกติบันทึกปกติ ฯลฯ ) จากนั้นการสุ่มตัวอย่างอ่างเก็บน้ำเป็นวิธีที่เหมาะสมในการประมาณค่าเปอร์เซนต์ / ค่ามัธยฐานจากจำนวนสตรีมยาวโดยพลการ

int n = 0;  // Running count of elements observed so far  
#define SIZE 10000
int reservoir[SIZE];  

while(streamHasData())
{
  int x = readNumberFromStream();

  if (n < SIZE)
  {
       reservoir[n++] = x;
  }         
  else 
  {
      int p = random(++n); // Choose a random number 0 >= p < n
      if (p < SIZE)
      {
           reservoir[p] = x;
      }
  }
}

"อ่างเก็บน้ำ" นั้นเป็นชุดรูปแบบ (ยุติธรรม) ตัวอย่างของอินพุตทั้งหมด - ไม่ว่าจะมีขนาดเท่าใดก็ตาม การหาค่ามัธยฐาน (หรือเปอร์เซ็นไทล์ใด ๆ ) นั้นเป็นเรื่องตรงไปตรงมาของการจัดเรียงอ่างเก็บน้ำและสำรวจจุดที่น่าสนใจ

เนื่องจากอ่างเก็บน้ำมีขนาดคงที่การเรียงลำดับจึงสามารถพิจารณาได้อย่างมีประสิทธิภาพ O (1) - และวิธีการนี้จะทำงานด้วยเวลาคงที่และการใช้หน่วยความจำ


เพราะเหตุใดคุณจึงต้องการความแปรปรวน
LazyCat

กระแสอาจส่งคืนน้อยกว่าองค์ประกอบ SIZE เพื่อให้อ่างเก็บน้ำว่างเปล่าครึ่งหนึ่ง สิ่งนี้ควรพิจารณาเมื่อคำนวณค่ามัธยฐาน
อเล็กซ์

มีวิธีทำให้เร็วขึ้นโดยการคำนวณความแตกต่างแทนค่ามัธยฐานหรือไม่ ตัวอย่างที่ถูกลบและเพิ่มและค่ามัธยฐานก่อนหน้านี้เพียงพอหรือไม่
inf3rno

30

วิธีที่มีประสิทธิภาพที่สุดในการคำนวณเปอร์เซ็นต์ไทล์ของสตรีมที่ฉันพบคืออัลกอริธึมP²: Raj Jain, Imrich Chlamtac: อัลกอริธึมP²สำหรับการคำนวณเชิงพลวัตของ Quantiiles และฮิสโตแกรมโดยไม่ต้องทำการสังเกต commun ACM 28 (10): 1076-1085 (1985)

อัลกอริทึมนั้นตรงไปตรงมาเพื่อนำไปใช้และทำงานได้ดีมาก อย่างไรก็ตามเป็นค่าประมาณดังนั้นโปรดจำไว้ว่า จากนามธรรม:

อัลกอริทึมแบบฮิวริสติกถูกนำเสนอสำหรับการคำนวณแบบไดนามิก qf ค่ามัธยฐานและค่าอื่น ๆ การประมาณการถูกสร้างขึ้นแบบไดนามิกเมื่อมีการสังเกต ข้อสังเกตจะไม่ถูกเก็บไว้; ดังนั้นอัลกอริทึมจึงมีขนาดเล็กมากและมีข้อกำหนดด้านการจัดเก็บที่แน่นอนโดยไม่คำนึงถึงจำนวนการสังเกต สิ่งนี้ทำให้มันเหมาะสำหรับการนำไปใช้ในชิปควอไทล์ที่สามารถใช้ในตัวควบคุมอุตสาหกรรมและเครื่องบันทึก อัลกอริทึมถูกขยายเพิ่มเติมเพื่อพล็อตฮิสโตแกรม วิเคราะห์ความแม่นยำของอัลกอริทึม


2
Count-Min Sketchดีกว่า P ^ 2 ซึ่งมันจะให้ข้อผิดพลาดที่ถูกผูกไว้ในขณะที่หลังไม่ได้
sinoTrinity

1
นอกจากนี้ให้พิจารณา "การคำนวณพื้นที่ออนไลน์อย่างมีประสิทธิภาพของสรุป Quantile" โดย Greenwald และ Khanna ซึ่งให้ขอบเขตข้อผิดพลาดและมีข้อกำหนดหน่วยความจำที่ดี
Paul Chernoch

1
นอกจากนี้สำหรับแนวทางความน่าจะเป็นให้ดูบทความในบล็อกนี้: research.neustar.biz/2013/09/16/ … และเอกสารที่อ้างถึงอยู่ที่นี่: arxiv.org/pdf/1407.1121v1.pdf สิ่งนี้เรียกว่า "กระเหม็ดกระแหม่ สตรีมมิ่ง "
Paul Chernoch

27

หากเราต้องการหาค่ามัธยฐานขององค์ประกอบที่เห็นล่าสุดnปัญหานี้มีวิธีการแก้ปัญหาที่แน่นอนที่ต้องการเพียงองค์ประกอบnที่เห็นล่าสุดที่จะถูกเก็บไว้ในหน่วยความจำ มันเร็วและปรับขนาดได้ดี

จัดทำดัชนี skiplistสนับสนุน O (LN n) แทรกการกำจัดและการค้นหาการจัดทำดัชนีขององค์ประกอบโดยพลการในขณะที่รักษาเรียงลำดับ เมื่อเชื่อมต่อกับคิว FIFOที่ติดตามรายการเก่าที่สุดลำดับที่ n การแก้ปัญหานั้นง่าย:

class RunningMedian:
    'Fast running median with O(lg n) updates where n is the window size'

    def __init__(self, n, iterable):
        self.it = iter(iterable)
        self.queue = deque(islice(self.it, n))
        self.skiplist = IndexableSkiplist(n)
        for elem in self.queue:
            self.skiplist.insert(elem)

    def __iter__(self):
        queue = self.queue
        skiplist = self.skiplist
        midpoint = len(queue) // 2
        yield skiplist[midpoint]
        for newelem in self.it:
            oldelem = queue.popleft()
            skiplist.remove(oldelem)
            queue.append(newelem)
            skiplist.insert(newelem)
            yield skiplist[midpoint]

ต่อไปนี้คือลิงก์สำหรับรหัสการทำงานที่สมบูรณ์ (เวอร์ชันคลาสที่เข้าใจง่ายและเวอร์ชันตัวสร้างที่ปรับให้เหมาะสมพร้อมกับโค้ด skiplist แบบอินไลน์ได้):


7
ถ้าฉันเข้าใจถูกต้องมันแค่ให้ค่ามัธยฐานขององค์ประกอบ N สุดท้ายที่คุณเห็นไม่ใช่องค์ประกอบทั้งหมดจนถึงจุดนั้น ดูเหมือนจะเป็นทางออกที่ลื่นไหลสำหรับการดำเนินการนั้น
Andrew C

16
ขวา. คำตอบนั้นฟังดูราวกับว่าเป็นไปได้ที่จะหาค่ามัธยฐานขององค์ประกอบทั้งหมดโดยเพียงแค่เก็บองค์ประกอบสุดท้าย n ในหน่วยความจำซึ่งเป็นไปไม่ได้โดยทั่วไป อัลกอริทึมเพิ่งพบค่ามัธยฐานขององค์ประกอบ n ล่าสุด
Hans-Peter Störr

8
คำว่า "Running median" มักใช้เพื่ออ้างถึงค่ามัธยฐานของชุดย่อยของข้อมูล OP ใช้คำศัพท์ทั่วไปในลักษณะที่ไม่ได้มาตรฐาน
Rachel Hettinger

18

วิธีคิดที่เข้าใจง่ายคือถ้าคุณมีแผนภูมิการค้นหาแบบทวิภาคที่สมดุลรากก็จะเป็นค่ามัธยฐานเนื่องจากจะมีองค์ประกอบที่เล็กกว่าและใหญ่กว่าจำนวนเดียวกัน ทีนี้ถ้าต้นไม้ไม่เต็มจะไม่เป็นเช่นนั้นเพราะจะมีองค์ประกอบที่หายไปจากระดับสุดท้าย

ดังนั้นสิ่งที่เราสามารถทำได้คือมีค่ามัธยฐานและต้นไม้ไบนารีสองต้นที่สมดุลหนึ่งต้นสำหรับองค์ประกอบที่น้อยกว่าค่ามัธยฐานและอีกหนึ่งต้นสำหรับองค์ประกอบที่มากกว่าค่ามัธยฐาน ต้นไม้สองต้นจะต้องเก็บไว้ในขนาดเดียวกัน

เมื่อเราได้รับจำนวนเต็มใหม่จากกระแสข้อมูลเราเปรียบเทียบกับค่ามัธยฐาน ถ้ามันยิ่งใหญ่กว่าค่ามัธยฐานเราจะเพิ่มมันลงในต้นไม้ที่เหมาะสม หากต้นไม้สองขนาดแตกต่างกันมากกว่า 1 เราจะลบองค์ประกอบขั้นต่ำของต้นไม้ที่เหมาะสมทำให้เป็นค่ามัธยฐานใหม่และวางค่ามัธยฐานเก่าไว้ในต้นไม้ด้านซ้าย ในทำนองเดียวกันสำหรับขนาดเล็ก


คุณจะทำอย่างไร "เราลบองค์ประกอบขั้นต่ำของต้นไม้ที่เหมาะสม"
Hengameh

2
ฉันหมายถึงแผนภูมิการค้นหาแบบทวิภาคดังนั้นองค์ประกอบขั้นต่ำเป็นวิธีที่เหลืออยู่จากราก
Irene Papakonstantinou

7

Efficient เป็นคำที่ขึ้นอยู่กับบริบท วิธีแก้ไขปัญหานี้ขึ้นอยู่กับจำนวนของแบบสอบถามที่ดำเนินการสัมพันธ์กับจำนวนของการแทรก สมมติว่าคุณกำลังใส่หมายเลข N และ K คูณท้ายคุณสนใจค่ามัธยฐาน ความซับซ้อนของอัลกอริทึมที่ใช้ฮีปคือ O (N log N + K)

พิจารณาทางเลือกต่อไปนี้ ตีตัวเลขในอาร์เรย์และสำหรับแต่ละเคียวรีให้รันอัลกอริธึมการเลือกเชิงเส้น (โดยใช้ quicksort pivot พูด) ตอนนี้คุณมีอัลกอริทึมที่ใช้เวลารัน O (KN) แล้ว

ตอนนี้ถ้า K มีขนาดเล็กเพียงพอ (แบบสอบถามที่ใช้ไม่บ่อย) อัลกอริทึมหลังจะมีประสิทธิภาพมากกว่า


1
ในตัวอย่างฮีปการค้นหาเป็นเวลาคงที่ดังนั้นฉันคิดว่าควรเป็น O (N log N + K) แต่จุดของคุณยังคงอยู่
แอนดรู C

ใช่จุดดีจะแก้ไขสิ่งนี้ คุณพูดถูก N log N ยังเป็นคำที่นำหน้า
Peteris

-2

คุณทำสิ่งนี้ไม่ได้ด้วยกองเดียวเหรอ? อัปเดต:ไม่ ดูความคิดเห็น

ค่าคงที่: หลังจากอ่าน2*nอินพุตแล้วค่า min-heap ก็จะมีค่าnมากที่สุด

วนซ้ำ: อ่าน 2 อินพุต เพิ่มพวกเขาทั้งสองไปที่กองและลบนาทีของกอง สิ่งนี้จะสถาปนาผู้ไม่แปรเปลี่ยน

ดังนั้นเมื่อ2nอ่านอินพุตแล้วค่า min ของฮีปจะเป็นค่า nth ที่ใหญ่ที่สุด จะต้องมีความซับซ้อนเป็นพิเศษเล็กน้อยโดยเฉลี่ยทั้งสององค์ประกอบรอบ ๆ ตำแหน่งเฉลี่ยและเพื่อจัดการคิวรีหลังจากป้อนข้อมูลเป็นจำนวนคี่


1
ใช้งานไม่ได้: คุณสามารถวางสิ่งที่ในภายหลังกลายเป็นใกล้ด้านบน ตัวอย่างเช่นลองอัลกอริทึมของคุณด้วยตัวเลข 1 ถึง 100 แต่เรียงกลับกัน: 100, 99, ... , 1
zellyn

ขอบคุณ zellyn โง่ของฉันที่จะโน้มน้าวตัวเองว่าค่าคงที่ได้รับการตีพิมพ์ซ้ำ
Darius Bacon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.