簡體   English   中英

給定 n 個數字和 k 個插槽。 這樣,對於每個插槽,它可以是 0,也可以是小於前一個數字的數字,Combinatorics

[英]Given n numbers and k slots. Such that for each slot it can be either 0, or a number less than the previous number, Combinatorics

我有編碼問題。 給定 n 個數字和 k 個插槽。 這樣對於每個插槽,它可以是 0,也可以是小於前一個數字的數字。 例如

對於 n=4,k=4

0000, 3000, 3200, 3210 etc.

對於 n=7,k=3

000, 700, 541, 731, 540 etc.

誰能告訴我這里的模式是什么,換句話說,描述可能性數量的公式是什么?

一些說明問題的python代碼(代碼本身並不重要,我正在尋找make_encod(n,k)的封閉形式)

from math import factorial
import math

def make_encod(n,k):
    tol=[""]
    for i in range(0,k):
        tol=make_strin_from_tile(0,max(n-i,1),tol)
    print(len(tol))
    print(tol)


def make_strin_from_tile(f,t,all):
    a=[]
    for b in all:
        for i in range(f,t):
            if len(b)==0 or int(b[-1])>i or int(b[-1])==0==i:
                a.append(f"{b}{i}")
    return a
#just some examples
print(make_encod(3,1))
print(make_encod(3,2))
print(make_encod(3,3))
print(make_encod(5,4))

會輸出:

> 3
['0', '1', '2']
None
4
['00', '10', '20', '21']
None
4
['000', '100', '200', '210']
None
16
['0000', '1000', '2000', '2100', '3000', '3100', '3200', '3210', '4000', '4100', '4200', '4210', '4300', '4310', '4320', '4321']
None

我正在尋找一個公式來告訴我 make_encod(n,k)) 的答案? 必須有一些更聰明的東西然后實際經歷這個

您可以在此處使用遞歸函數

def recur(lst,ln,curr='a'):
     if ln==len(curr[1:]):
         print(curr[1:])
         return
     else:
         for i in lst:
             if curr[-1]>i or i=='0':
                 recur(lst,ln,curr+i)

為什么我使用'a'作為初始curr是因為all('a'>str(i) for i in range(10))= True


a=[str(i) for i in range(3)] #['0','1','2']
recur(a,1)
#0 1 2
recur(a,2)
00 10 20 21
recur(a,3)
000 100 200 210
b=[str(i) for i in range(5)] #['0','1','2','3','4']
recur(b,4)
0000 1000 2000 2100 3000 3100 3200 3210 4000 4100 4200 4210 4300 4310 4320 4321

如果我正確理解條件,則此問題映射到

從一組n 個不同的數字中選取k 個元素的組合數是多少

因為您可以通過從有序集合 [ n, n-1, n-2 ... 1] 中刪除除k 或更少之外的所有內容來獲得所有合法組合,然后用零填充任何剩余的插槽。

一組 n 中 k 或更少的對象的數量是

( n! / n! ) + ( n! / (n-1)! ) + ... + ( n! / (n-k)! ) 
= sum_(i=0)^k (n!)/((n - i)!)

我目前無法說出明確的公式。 稍后我可能會回來嘗試解決它,但歡迎任何比我更擅長求和的人這樣做。

免責聲明:我從來沒有用英語做過數學,所以如果我的一些詞匯量不足,請原諒我

檢查三元組數量的最佳方法(小於 O(n^2) )其中 a[k] <a[i]<a[j] for all i<j<k in an array< div><div id="text_translate"><p> 我正在解決一個問題,我必須在數組中找到 Ai、Aj 和 Ak 三元組的數量,使得 Ak &lt; Ai &lt; Aj 和 i &lt; j &lt; k。 我知道來自<a href="https://www.geeksforgeeks.org/count-of-triplets-in-an-array-i-j-k-such-that-i-j-k-and-ak-ai-aj/" rel="nofollow noreferrer">https://www.geeksforgeeks.org/count-of-triplets-in-an-array-ijk-such-that-ijk-</a>的時間復雜度 O(n^2) 和 O(n^3) 代碼<a href="https://www.geeksforgeeks.org/count-of-triplets-in-an-array-i-j-k-such-that-i-j-k-and-ak-ai-aj/" rel="nofollow noreferrer">and-ak-ai-aj/</a>來做到這一點... O(n^3) 時間復雜度代碼:</p><pre> def CountTriplets(arr, n): cnt = 0; for i in range(0, n): for j in range(i + 1, n): for k in range(j + 1, n): # If it satisfy the # given conditions if (arr[k] &lt; arr[i] and arr[i] &lt; arr[j]): cnt += 1; # Return the final count return cnt; # Driver Code # Given array arr[] arr = [ 2, 5, 1, 3, 0 ]; n = len(arr); # Function Call print(CountTriplets(arr, n))</pre><p> 和 O(n^2) 時間復雜度代碼:</p><pre> # Function to count triplets def CountTriplets(a, n): # To store count # of total triplets ans = 0 for i in range (n): # Initialize count to zero cnt = 0 for j in range (i + 1, n): # If a[j] &gt; a[i] then, # increment cnt if (a[j] &gt; a[i]): cnt += 1 # If a[j] &lt; a[i], then # it mean we have found a[k] # such that a[k] &lt; a[i] &lt; a[j] else: ans += cnt # Return the final count return ans # Driver code if __name__ == "__main__": arr = [2, 5, 1, 3, 0] n = len(arr) print (CountTriplets(arr, n))</pre><p> 我認為這個問題可以用小於 O(n^2) 的時間復雜度來解決。</p><p> 我看到這個具有挑戰性的問題由 50 人在本地(非英語)網站上以小於 O(n^2) 的時間復雜度解決,但我們看不到解決方案。 </p></div></a[i]<a[j]>

[英]Optimal way ( less than O(n^2) ) to check for number of triplets where a[k]<a[i]<a[j] for all i<j<k in an array

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 在給定的 N 個數字中找出 K 的倍數 寫一個 function,給定自然數 n,m,確定最小的自然數 k 使得 n^k >= m,時間為 O(log k) 在numpy中轉換一組數字,以便將每個數字轉換為一些小於它的其他數字 計算小於非負數的質數個數,在Python中為n 找到與給定數字最接近的 k 個數字 如何計算python中大於和小於給定數字集的數字 檢查三元組數量的最佳方法(小於 O(n^2) )其中 a[k] <a[i]<a[j] for all i<j<k in an array< div><div id="text_translate"><p> 我正在解決一個問題,我必須在數組中找到 Ai、Aj 和 Ak 三元組的數量,使得 Ak &lt; Ai &lt; Aj 和 i &lt; j &lt; k。 我知道來自<a href="https://www.geeksforgeeks.org/count-of-triplets-in-an-array-i-j-k-such-that-i-j-k-and-ak-ai-aj/" rel="nofollow noreferrer">https://www.geeksforgeeks.org/count-of-triplets-in-an-array-ijk-such-that-ijk-</a>的時間復雜度 O(n^2) 和 O(n^3) 代碼<a href="https://www.geeksforgeeks.org/count-of-triplets-in-an-array-i-j-k-such-that-i-j-k-and-ak-ai-aj/" rel="nofollow noreferrer">and-ak-ai-aj/</a>來做到這一點... O(n^3) 時間復雜度代碼:</p><pre> def CountTriplets(arr, n): cnt = 0; for i in range(0, n): for j in range(i + 1, n): for k in range(j + 1, n): # If it satisfy the # given conditions if (arr[k] &lt; arr[i] and arr[i] &lt; arr[j]): cnt += 1; # Return the final count return cnt; # Driver Code # Given array arr[] arr = [ 2, 5, 1, 3, 0 ]; n = len(arr); # Function Call print(CountTriplets(arr, n))</pre><p> 和 O(n^2) 時間復雜度代碼:</p><pre> # Function to count triplets def CountTriplets(a, n): # To store count # of total triplets ans = 0 for i in range (n): # Initialize count to zero cnt = 0 for j in range (i + 1, n): # If a[j] &gt; a[i] then, # increment cnt if (a[j] &gt; a[i]): cnt += 1 # If a[j] &lt; a[i], then # it mean we have found a[k] # such that a[k] &lt; a[i] &lt; a[j] else: ans += cnt # Return the final count return ans # Driver code if __name__ == "__main__": arr = [2, 5, 1, 3, 0] n = len(arr) print (CountTriplets(arr, n))</pre><p> 我認為這個問題可以用小於 O(n^2) 的時間復雜度來解決。</p><p> 我看到這個具有挑戰性的問題由 50 人在本地(非英語)網站上以小於 O(n^2) 的時間復雜度解決,但我們看不到解決方案。 </p></div></a[i]<a[j]> 重新排序列表,以使所有先前數字的總和盡可能小於當前數字 打印小於給定最大值的數字的倍數 重寫代碼以生成包含從2開始的連續質數的所有數字,小於給定數字
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM