Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Python

Python: स्ट्रिंग निर्माण के लिए न्यूनतम तत्वों का संयोजन खोजना

Python में दी गई सूची से न्यूनतम संख्या में तत्व चुनकर, उनके वर्णों से लक्ष्य स्ट्रिंग बनाना संभव है या नहीं जांचना। यह एक सेट कवर / संयोजन खोज समस्या है।

समस्या

सूची: ["python", "is", "fun", "to", "learn"]

लक्ष्य: "onis"

न्यूनतम कितने तत्व चाहिए जिनके वर्णों से "onis" बने?

उत्तर: 2 ("python" में o,n,i,s और "is" में i,s - लेकिन "python" अकेले ही पर्याप्त है!)

मूल लेख का दृष्टिकोण (कॉम्बिनेशन ब्रूट-फोर्स)

from itertools import combinations

my_list = ["python", "is", "fun", "to", "learn"]
my_target_str = "onis"
print("सूची:", my_list)
print("लक्ष्य:", my_target_str)

my_result = -1
target_set = set(my_target_str)
found = False

for r in range(len(my_list) + 1):
    for combo in combinations(my_list, r):
        # संयोजन के सभी वर्णों को मिलाएं
        combined_chars = set(''.join(combo))
        if target_set.issubset(combined_chars):
            my_result = r
            found = True
            break
    if found:
        break

print(f"न्यूनतम तत्व: {my_result}")

आउटपुट

सूची: ['python', 'is', 'fun', 'to', 'learn']
लक्ष्य: onis
न्यूनतम तत्व: 1

नोट: मूल लेख का आउटपुट 2 था, लेकिन सही उत्तर 1 है

"python" में o, n, i, s सभी वर्ण मौजूद हैं, इसलिए केवल 1 तत्व काफी है। मूल लेख में लॉजिक त्रुटि थी।

सही और कुशल दृष्टिकोण

1. लालची दृष्टिकोण (Greedy - अनुमानित)

def min_elements_greedy(words, target):
    """लालची: सबसे अधिक नए वर्ण कवर करने वाला शब्द चुनें"""
    target_set = set(target)
    covered = set()
    selected = []
    remaining_words = list(words)
    
    while covered != target_set and remaining_words:
        # सबसे अधिक नए वर्ण कवर करने वाला शब्द खोजें
        best_word = max(remaining_words, key=lambda w: len(set(w) & (target_set - covered)))
        new_chars = set(best_word) & (target_set - covered)
        if not new_chars:
            break  # प्रगति नहीं
        covered |= new_chars
        selected.append(best_word)
        remaining_words.remove(best_word)
    
    return len(selected) if covered == target_set else -1, selected

print("लालची:", min_elements_greedy(my_list, "onis"))

2. BFS (सटीक न्यूनतम, छोटे इनपुट के लिए)

from collections import deque

def min_elements_bfs(words, target):
    """BFS से सटीक न्यूनतम खोजें"""
    target_set = set(target)
    word_sets = [set(w) for w in words]
    
    # State: (covered_set, used_indices_tuple)
    queue = deque([(frozenset(), ())])
    visited = set([frozenset()])
    
    while queue:
        covered, used = queue.popleft()
        if covered == target_set:
            return len(used), [words[i] for i in used]
        
        for i, wset in enumerate(word_sets):
            if i not in used:
                new_covered = covered | (wset & target_set)
                new_used = used + (i,)
                if new_covered not in visited:
                    visited.add(new_covered)
                    queue.append((new_covered, new_used))
    
    return -1, []

print("BFS:", min_elements_bfs(my_list, "onis"))

3. डायनामिक प्रोग्रामिंग (बिटमास्क, छोटे वर्ण सेट के लिए)

def min_elements_dp(words, target):
    """बिटमास्क DP - वर्ण सेट छोटा हो (≤20) तो तेज़"""
    # लक्ष्य वर्णों को इंडेक्स मैप करें
    unique_chars = list(set(target))
    char_to_bit = {c: i for i, c in enumerate(unique_chars)}
    target_mask = (1 << len(unique_chars)) - 1
    
    # प्रत्येक शब्द का बिटमास्क
    word_masks = []
    for w in words:
        mask = 0
        for c in set(w) & set(target):
            mask |= 1 << char_to_bit[c]
        if mask:
            word_masks.append(mask)
    
    # DP: dp[mask] = न्यूनतम शब्द
    INF = float('inf')
    dp = [INF] * (1 << len(unique_chars))
    dp[0] = 0
    
    for wmask in word_masks:
        for mask in range(target_mask, -1, -1):
            if dp[mask] != INF:
                new_mask = mask | wmask
                dp[new_mask] = min(dp[new_mask], dp[mask] + 1)
    
    return dp[target_mask] if dp[target_mask] != INF else -1

print("DP:", min_elements_dp(my_list, "onis"))

व्यावहारिक उपयोग: शब्द खेल, स्क्रैबल सहायक

def scrabble_helper(tiles, dictionary):
    """टाइल्स से बन सकने वाले शब्द खोजें"""
    tile_set = set(tiles)
    valid = []
    for word in dictionary:
        if set(word).issubset(tile_set):
            # आवृत्ति भी जांचें
            from collections import Counter
            if all(Counter(word)[c] <= Counter(tiles)[c] for c in word):
                valid.append(word)
    return sorted(valid, key=len, reverse=True)

# टेस्ट
tiles = list("pythonisfun")
dictionary = ["python", "is", "fun", "to", "learn", "on", "in", "no", "tip", "hot"]
print("स्क्रैबल शब्द:", scrabble_helper(tiles, dictionary))

सारांश

विधिसटीकतासमय जटिलताउपयुक्त
कॉम्बिनेशन ब्रूट-फोर्ससटीकO(2^n)n ≤ 20
लालची (Greedy)अनुमानितO(n²)बड़े n, अनुमान ठीक
BFSसटीकO(n * 2^|target|)छोटा लक्ष्य वर्ण सेट
बिटमास्क DPसटीकO(n * 2^|target|)|target| ≤ 20
  1. पायथन प्रोग्राम: बबल सॉर्ट एल्गोरिदम पायथन प्रोग्राम: बबल सॉर्ट एल्गोरिदम

    इस लेख में, हम बबल सॉर्ट सॉर्टिंग तकनीक के कार्यान्वयन के बारे में जानेंगे।नीचे दिखाई गई आकृति इस एल्गोरिदम के कार्य को दर्शाती है -दृष्टिकोणपहले तत्व (इंडेक्स = 0) से शुरू करके, वर्तमान तत्व की तुलना सरणी के अगले तत्व से करें।यदि वर्तमान तत्व सरणी के अगले तत्व से बड़ा है, तो उन्हें स्वैप करें।यदि व

  1. - पायथन प्रोग्राम: बाइनरी सर्च एल्गोरिदम

    इस लेख में, हम दी गई समस्या के समाधान और दृष्टिकोण के बारे में जानेंगे।समस्या कथन - हमें एक सॉर्ट की गई सूची दी जाएगी और हमें बाइनरी सर्च की मदद से एक तत्व ढूंढना होगा।एल्गोरिदमx की तुलना मध्य तत्व से करें।यदि x मध्य तत्व से मेल खाता है, तो हम मध्य इंडेक्स वापस करते हैं।अन्यथा यदि x मध्य तत्व से बड़

  1. पायथन प्रोग्राम: लीनियर सर्च एल्गोरिदम पायथन प्रोग्राम: लीनियर सर्च एल्गोरिदम

    इस लेख में, हम पायथन 3.x या उससे पहले के संस्करण में लीनियर सर्च और इसके कार्यान्वयन के बारे में जानेंगे।एल्गोरिदमदिए गए arr[] के बाएं सबसे तत्व से शुरू करें और एक-एक करके तत्व x की तुलना arr[] के प्रत्येक तत्व से करेंयदि x किसी तत्व से मेल खाता है, तो इंडेक्स मान वापस करें।यदि x, arr[] के किसी भी त