Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมหาค่าคาดหวังของค่าความถี่สูงสุดที่เกิดขึ้นของผลลัพธ์นิพจน์ในPython


สมมติว่าเรามีนิพจน์ M ต่างกัน และคำตอบของนิพจน์เหล่านี้อยู่ในช่วง 1 ถึง N (รวมทั้งสอง) ดังนั้นให้พิจารณา x =max(f(i)) สำหรับแต่ละ i ในช่วง 1 ถึง N เราต้องหาค่าที่คาดหวัง ของ x.

ดังนั้น หากอินพุตเป็น M =3, N =3 เอาต์พุตจะเป็น 2.2 เพราะ

ลำดับ ความถี่สูงสุด
111 3
112 2
113 2
122 2
123 1
133 1
222 3
223 2
233 2
333 3

$$E(x) =\sum P(x) * x =P(1) + 2P(2) + 3P(3) =\frac{1}{10} + 2 * \frac{6}{10} + 3 * \frac{3}{10} =\frac{22}{10}$$

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • การรวมกัน :=แผนที่ใหม่
  • กำหนดฟังก์ชัน nCr() นี่จะใช้เวลา n, k_in
  • k :=ขั้นต่ำของ k_in และ (n - k_in)
  • ถ้า n
  • คืน 0
  • มิฉะนั้นเมื่อ (n, k) รวมกันแล้ว
    • ผลตอบแทนรวมกัน[n, k]
  • มิฉะนั้นเมื่อ k เท่ากับ 0 แล้ว
    • คืน 1
  • มิฉะนั้นเมื่อ n เหมือนกับ k แล้ว
    • คืน 1
  • มิฉะนั้น
    • a :=1
    • สำหรับ cnt ในช่วง 0 ถึง k - 1 ทำ
      • a :=a * (n - cnt)
      • a :=ชั้นของ a/(cnt + 1)
      • ชุดค่าผสม[n, cnt + 1] :=a
    • คืนสินค้า
  • จากวิธีหลัก ให้ทำดังนี้:
  • arr :=รายการใหม่
  • สำหรับ k ในช่วง 2 ถึง M + 1 ทำ
    • a :=1
    • s :=0
    • สำหรับฉันในช่วง 0 ถึงพื้นของ M/k + 2 ทำ
      • ถ้า M
      • ออกมาจากลูป
    • s :=s + a * nCr(N, i) * nCr(N-1+M-i*k, M-i*k)
    • a :=-a
  • ใส่ s ต่อท้าย arr
  • ผลรวม :=องค์ประกอบสุดท้ายของ arr
  • diff :=อาร์เรย์ที่แทรก arr[0] ที่จุดเริ่มต้น จากนั้นเพิ่มรายการโดยที่ (arr[cnt + 1] - arr[cnt]) สำหรับแต่ละ cnt ในช่วง 0 ถึง M - 2
  • ผลลัพธ์ :=ผลรวมขององค์ประกอบทั้งหมดที่มีอยู่ใน (diff[cnt] *(cnt + 1) / รวมสำหรับ cnt ในช่วง 0 ถึง M-1)
  • ผลตอบแทนที่ได้
  • ตัวอย่าง

    ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    combination = {}
    def nCr(n, k_in):
       k = min(k_in, n - k_in)
       if n < k or k < 0:
          return 0
       elif (n, k) in combination:
          return combination[(n, k)]
       elif k == 0:
          return 1
       elif n == k:
          return 1
       else:
          a = 1
          for cnt in range(k):
             a *= (n - cnt)
             a //= (cnt + 1)
             combination[(n, cnt + 1)] = a
          return a
    
    def solve(M, N):
       arr = []
       for k in range(2, M + 2):
          a = 1
          s = 0
          for i in range(M // k + 2):
             if (M < i * k):
                break
             s += a * nCr(N, i) * nCr(N - 1 + M - i * k, M - i * k)
             a *= -1
          arr.append(s)
       total = arr[-1]
       diff = [arr[0]] + [arr[cnt + 1] - arr[cnt] for cnt in range(M - 1)]
       output = sum(diff[cnt] * (cnt + 1) / total for cnt in range(M))
       return output
    
    M = 3
    N = 3
    print(solve(M, N))

    อินพุต

    3, 3

    ผลลัพธ์

    1