यह एक बहुत ही कठिन संयोजन समस्या है। वास्तव में Subgraph Isomorphism Problem आपकी समस्या में कम किया जा सकता है (यदि मैट्रिक्स A
में केवल 0-1 प्रविष्टियां हैं, तो आपकी समस्या बिल्कुल एक उप-आइसोमोर्फिज्म समस्या है)। यह समस्या एनपी-पूर्ण होने के लिए जाना जाता है।
यहां एक रिकर्सिव बैकट्रैकिंग समाधान है जो सभी संभावित समाधानों को ब्रूट करने के लिए थोड़ा बेहतर करता है। ध्यान दें कि यह अभी भी सबसे खराब मामले में घातीय समय लेता है। हालांकि, यदि आप मानते हैं कि कोई समाधान मौजूद है और अस्पष्टता (उदाहरण के लिए B
में सभी प्रविष्टियां अलग हैं), तो यह रैखिक समय में समाधान पाता है।
def locate_columns(a, b, offset=0):
"""Locate `a` as a sublist of `b`.
Yields all possible lists of `len(a)` indices such that `a` can be read
from `b` at those indices.
"""
if not a:
yield []
else:
positions = (offset + i for (i, e) in enumerate(b[offset:])
if e == a[0])
for position in positions:
for tail_cols in locate_columns(a[1:], b, position + 1):
yield [position] + tail_cols
def locate_submatrix(a, b, offset=0, cols=None):
"""Locate `a` as a submatrix of `b`.
Yields all possible pairs of (row_indices, column_indices) such that
`a` is the projection of `b` on those indices.
"""
if not a:
yield [], cols
else:
for j, row in enumerate(b[offset:]):
if cols:
if all(e == f for e, f in zip(a[0], [row[c] for c in cols])):
for r, c in locate_submatrix(a[1:], b, offset + j + 1, cols):
yield [offset + j] + r, c
else:
for cols in locate_columns(a[0], row):
for r, c in locate_submatrix(a[1:], b, offset + j + 1, cols):
yield [offset + j] + r, c
B = [[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15], [16,17,18,19,20]]
A = [[6,8], [16,18]]
for loc in locate_submatrix(A, B):
print loc
हो जाएगा ताकि उत्पादन:
([1, 3], [0, 2])
'[[6,8,9], [16,18,19]]' मान्य उप मैट्रिक्स है? (दूसरे शब्दों में, क्या आप संभावित रूप से प्रत्येक धुरी पर सूचकांक की सूची ढूंढ रहे हैं, या केवल एक स्टार्ट/स्टॉप/स्टेप स्लाइस?) – abarnert
साथ ही, क्या हमें लगता है कि आप स्पष्ट ब्रूट फोर्स सॉल्यूशन को समझ सकते हैं, इसलिए यह उल्लेखनीय नहीं है (कम से कम एक तर्क के बिना कि कुछ भी अधिक कुशल नहीं है)? – abarnert
क्या आप मानते हैं कि मैट्रिक्स 'ए' में पंक्तियों/स्तंभों को दोहराया जा सकता है? क्या आप मानते हैं कि पंक्तियों और कॉलम 'बी' और 'ए' में एक ही क्रम में दिखाई देते हैं? – Thibaut