তালিকার কোনও মান বিদ্যমান কিনা তা যাচাই করার দ্রুততম উপায়


815

কোনও তালিকায় কোনও মান বিদ্যমান (লক্ষ লক্ষ মান সহ একটি তালিকা) এবং এর সূচকটি কী কী তা জানার দ্রুততম উপায় কী?

আমি জানি যে তালিকার সমস্ত মান এই উদাহরণ হিসাবে অনন্য।

আমি যে প্রথম পদ্ধতিটি চেষ্টা করে তা হ'ল (আমার আসল কোডে 3.8 সেকেন্ড):

a = [4,2,3,1,5,6]

if a.count(7) == 1:
    b=a.index(7)
    "Do something with variable b"

দ্বিতীয় পদ্ধতিটি আমি চেষ্টা করি (2x দ্রুত: আমার আসল কোডের জন্য 1.9 সেকেন্ড):

a = [4,2,3,1,5,6]

try:
    b=a.index(7)
except ValueError:
    "Do nothing"
else:
    "Do something with variable b"

স্ট্যাক ওভারফ্লো ব্যবহারকারীর প্রস্তাবিত পদ্ধতিগুলি (আমার আসল কোডের জন্য 2.74 সেকেন্ড):

a = [4,2,3,1,5,6]
if 7 in a:
    a.index(7)

আমার আসল কোডে, প্রথম পদ্ধতিটি 3.81 সেকেন্ড এবং দ্বিতীয় পদ্ধতিতে লাগে 1.88 সেকেন্ড। এটি একটি ভাল উন্নতি, কিন্তু:

আমি পাইথন / স্ক্রিপ্টিং সহ একটি শিক্ষানবিস এবং একই জিনিসগুলি করার এবং আরও বেশি সময় প্রক্রিয়াকরণের সময় বাঁচানোর কি আরও দ্রুত উপায় আছে?

আমার আবেদনের জন্য আরও সুনির্দিষ্ট ব্যাখ্যা:

ব্লেন্ডার এপিআইতে আমি কণার একটি তালিকা অ্যাক্সেস করতে পারি:

particles = [1, 2, 3, 4, etc.]

সেখান থেকে, আমি একটি কণার অবস্থান অ্যাক্সেস করতে পারি:

particles[x].location = [x,y,z]

এবং প্রতিটি কণার জন্য আমি পরীক্ষা করে দেখি যে প্রতিবেশীর মতো প্রতিটি কণার অবস্থান অনুসন্ধান করে এটি উপস্থিত রয়েছে:

if [x+1,y,z] in particles.location
    "Find the identity of this neighbour particle in x:the particle's index
    in the array"
    particles.index([x+1,y,z])

5
অজগরটিতে বর্গাকার বন্ধনীগুলির জিনিসটিকে একটি অ্যারে নয়, তালিকা বলা হয়। তালিকা ব্যবহারের পরিবর্তে একটি সেট ব্যবহার করুন। অথবা আপনার তালিকাটি বাছাই করুন এবং bisectমডিউলটি ব্যবহার করুন
স্টিভেন রাম্বালস্কি

সুতরাং আপনি কি সূচক জাগল করা প্রয়োজন? বা আসলে অর্ডার করে না এবং আপনি কেবল সদস্য শিপ পরীক্ষা, ছেদগুলি ইত্যাদি করতে চান? ক্রম কথায়, এটি আপনি কী করতে চেষ্টা করছেন তার উপর নির্ভর করে। সেটগুলি আপনার জন্য কাজ করতে পারে এবং তারপরে সেগুলি সত্যিই ভাল উত্তর, তবে আপনি যে কোডটি দেখিয়েছেন তা থেকে আমরা বলতে পারি না।

2
সম্ভবত আপনাকে আপনার প্রশ্নে উল্লেখ করতে হবে যে আপনার মানের প্রয়োজন নেই, তবে এটির সূচক।
রোমান বোদনারচুক

আমি আমার প্রশ্নটি সম্পাদনা করছি এবং আমি কী করতে চাই তা আরও পরিষ্কারভাবে ব্যাখ্যা করার চেষ্টা করছি ... আমিও তাই আশা করি ...
জিন-ফ্রাঙ্কোইস গ্যালান্ট

1
@ স্টিভেন রুমালস্কি: কারণ সেটে সদৃশ সামগ্রী থাকতে পারে না, যদিও জিন কণার অবস্থান (x, y, z একইরকম হতে পারে) সংরক্ষণ করতে চায়, আমরা এই ক্ষেত্রে সেটটি ব্যবহার করতে পারি না
হিউ ভিও

উত্তর:


1565
7 in a

এটি করার সবচেয়ে পরিষ্কার এবং দ্রুততম উপায়।

আপনি একটি ব্যবহার করার বিষয়েও বিবেচনা করতে পারেন set, তবে আপনার তালিকা থেকে সেটটি তৈরি করা দ্রুত সদস্যতার পরীক্ষার চেয়ে বেশি সময় নিতে পারে। নিশ্চিত হওয়ার একমাত্র উপায় হ'ল ভালভাবে বেনমার্ক করা। (এটি আপনার কী অপারেশনগুলির প্রয়োজন তার উপরও নির্ভর করে)


5
তবে আপনার সূচক নেই এবং এটি পাওয়ার জন্য আপনি যা সঞ্চয় করেছেন তার জন্য ব্যয় হবে।
রডরিগো

6
লাইক: যদি 7 এ a: b = a.index (7)?
জিন-ফ্রাঙ্কোইস গ্যালান্ট

26
@ স্টিভেন রাম্বালস্কি: সেটগুলি কেবলমাত্র একটি বিকল্প যদি আপনার এটির অর্ডার দেওয়ার প্রয়োজন না হয় (এবং সেইজন্য, একটি সূচি থাকে)। এবং সেট করা হয় পরিষ্কারভাবে উল্লেখ উত্তরে, এটা ঠিক এছাড়াও প্রশ্নের একটি সহজবোধ্য উত্তর হিসাবে ওপি জিজ্ঞেস দেয়। আমি মনে করি না এটির মূল্য -1।

আমি আমার প্রশ্নটি সম্পাদনা করছি এবং আমি কী করতে চাই তা আরও পরিষ্কারভাবে ব্যাখ্যা করার চেষ্টা করছি ... আমিও তাই আশা করি ...
জিন-ফ্রাঙ্কোইস গ্যালান্ট

1
ঠিক আছে, আমি আপনার বাস্তব কোডটি আপনার পদ্ধতিটি চেষ্টা করে দেখছি এবং এটি আরও একটু সময় নিয়েছে কারণ সম্ভবত আমাকে মূল্য সূচকটি জানতে হবে। আমার দ্বিতীয় পদ্ধতিটি সহ, আমি এটি উপস্থিত কিনা তা যাচাই করি এবং একই সাথে সূচকটি পাই।
জিন-ফ্রাঙ্কোইস গ্যালান্ট

211

অন্যদের দ্বারা যেমন বলা হয়েছে, inবড় তালিকার জন্য খুব ধীর হতে পারে। এখানে কিছু পারফরম্যান্সের তুলনা করা হয়েছে in, setএবং bisect। নোট করুন সময়টি (দ্বিতীয় সেকেন্ডে) লগ স্কেলে রয়েছে।

এখানে চিত্র বর্ণনা লিখুন

পরীক্ষার জন্য কোড:

import random
import bisect
import matplotlib.pyplot as plt
import math
import time

def method_in(a,b,c):
    start_time = time.time()
    for i,x in enumerate(a):
        if x in b:
            c[i] = 1
    return(time.time()-start_time)   

def method_set_in(a,b,c):
    start_time = time.time()
    s = set(b)
    for i,x in enumerate(a):
        if x in s:
            c[i] = 1
    return(time.time()-start_time)

def method_bisect(a,b,c):
    start_time = time.time()
    b.sort()
    for i,x in enumerate(a):
        index = bisect.bisect_left(b,x)
        if index < len(a):
            if x == b[index]:
                c[i] = 1
    return(time.time()-start_time)

def profile():
    time_method_in = []
    time_method_set_in = []
    time_method_bisect = []

    Nls = [x for x in range(1000,20000,1000)]
    for N in Nls:
        a = [x for x in range(0,N)]
        random.shuffle(a)
        b = [x for x in range(0,N)]
        random.shuffle(b)
        c = [0 for x in range(0,N)]

        time_method_in.append(math.log(method_in(a,b,c)))
        time_method_set_in.append(math.log(method_set_in(a,b,c)))
        time_method_bisect.append(math.log(method_bisect(a,b,c)))

    plt.plot(Nls,time_method_in,marker='o',color='r',linestyle='-',label='in')
    plt.plot(Nls,time_method_set_in,marker='o',color='b',linestyle='-',label='set')
    plt.plot(Nls,time_method_bisect,marker='o',color='g',linestyle='-',label='bisect')
    plt.xlabel('list size', fontsize=18)
    plt.ylabel('log(time)', fontsize=18)
    plt.legend(loc = 'upper left')
    plt.show()

15
উত্তরে কাটা-পেস্ট, এক্সিকিউটেবল কোড পছন্দ করুন। অন্যকে কয়েক সেকেন্ড সময় সাশ্রয় করতে আপনার 3 টি আমদানি দরকার: import random / import bisect / import matplotlib.pyplot as pltএবং তারপরে কল করুন:profile()
কেগ্রাস্টি

1
এটি অজগরটির কোন সংস্করণ?
কাউবার্ট

কোড পেতে সর্বদা দুর্দান্ত তবে কেবল মাথা চালানোর জন্য আমাকে চালানোর জন্য সময় আমদানি করতে হয়েছিল
WHLA

এবং বিনীত range()বস্তু ভুলবেন না । ব্যবহার করার সময় var in [integer list], কোনও range()বস্তু একই ক্রমটি মডেল করতে পারে কিনা তা দেখুন । কোনও সেটের পারফরম্যান্সে খুব কাছাকাছি, তবে আরও সংক্ষিপ্ত।
মার্টিজন পিটারস

37

আপনি আপনার আইটেম একটি মধ্যে রাখতে পারে set। সেট লুকআপগুলি খুব দক্ষ।

চেষ্টা করুন:

s = set(a)
if 7 in s:
  # do stuff

সম্পাদনা করুন একটি মন্তব্যে আপনি বলেছেন যে আপনি উপাদানটির সূচক পেতে চান। দুর্ভাগ্যক্রমে, সেটগুলির উপাদান অবস্থানের কোনও ধারণা নেই। বিকল্পটি হল আপনার তালিকার প্রাক-বাছাই করা এবং তারপরে যখনই কোনও উপাদান খুঁজে পাওয়ার দরকার হয় তখন বাইনারি অনুসন্ধান ব্যবহার করুন search


এবং যদি এর পরে আমি এই মানটির সূচকটি জানতে চাই, তবে এটি সম্ভব এবং আপনার এটি করার একটি দ্রুত উপায় আছে?
জিন-ফ্রাঙ্কোইস গ্যালান্ট

@ জিন-ফ্রাঙ্কোইস গ্যালান্ট: এই ক্ষেত্রে সেটগুলি খুব বেশি কাজে আসবে না। আপনি তালিকার প্রাক-বাছাই করতে পারেন এবং তারপরে বাইনারি অনুসন্ধান ব্যবহার করতে পারেন। আমার আপডেট করা উত্তর দেখুন দয়া করে।
এনপিই

আমি আমার প্রশ্নটি সম্পাদনা করছি এবং আমি কী করতে চাই তা আরও পরিষ্কারভাবে ব্যাখ্যা করার চেষ্টা করছি ... আমিও তাই আশা করি ...
জিন-ফ্রাঙ্কোইস গ্যালান্ট

30
def check_availability(element, collection: iter):
    return element in collection

ব্যবহার

check_availability('a', [1,2,3,4,'a','b','c'])

আমি বিশ্বাস করি যে এটি নির্বাচিত মান একটি অ্যারেতে রয়েছে কিনা তা জানার দ্রুততম উপায়।


71
return 'a' in a?
শিকিরিউ

4
কোডটি আপনাকে একটি সংজ্ঞায়িত করতে হবে: Def listValue (): a = [1,2,3,4, 'a', 'b', 'c'] ax 'listValue () মুদ্রণে' a 'ফেরান x)
টেনজিন

12
এটি একটি কার্যকর পাইথন উত্তর এটি খুব ভাল, পঠনযোগ্য কোড নয়।
রিক হেন্ডারসন

1
সাবধান! এটি মেলে এমনটি সম্ভবত সম্ভবত আপনি প্রত্যাশা করেননি:o='--skip'; o in ("--skip-ias"); # returns True !
অ্যালেক্স এফ

3
@ অ্যালেক্স এফ inঅপারেটর সাবস্ট্রিং সদস্যতার পরীক্ষা করার জন্য একইভাবে কাজ করে। এখানে বিভ্রান্তিকর অংশটি সম্ভবত এটি ("hello")একটি একক মানের টিউপল নয়, যখন ("hello",)- কমাটি পার্থক্য করে। o in ("--skip-ias",)হয় Falseআশানুরূপ।
মক্সিবল 21

16
a = [4,2,3,1,5,6]

index = dict((y,x) for x,y in enumerate(a))
try:
   a_index = index[7]
except KeyError:
   print "Not found"
else:
   print "found"

এটি কেবল তখনই ভাল ধারণা হবে যদি কোনও পরিবর্তন হয় না এবং এইভাবে আমরা একবার ডিক () অংশটি করতে পারি এবং তারপরে বারবার ব্যবহার করতে পারি। যদি কোনও পরিবর্তন হয় তবে দয়া করে আপনি কী করছেন সে সম্পর্কে আরও বিশদ সরবরাহ করুন।


এটি কার্যকর তবে আমার কোডে প্রয়োগ করা হয় না: "টাইপরর: অকার্যকর টাইপ: 'তালিকা'
জ্যান-ফ্রাঙ্কোইস গ্যালান্ট

1
@ জিন-ফ্রাঙ্কোইস গ্যালান্ট, সম্ভবত আপনি সেই তালিকাগুলি ব্যবহার করছেন যেখানে আপনাকে টিপলস ব্যবহার করা উচিত। আপনার কোডটি কীভাবে গতি বাড়ানো যায় সে সম্পর্কে আপনি যদি বিস্তৃত পরামর্শ চান তবে আপনার এটি কোডেরভিউ.সটাকেক্সচেঞ্জ.কম এ পোস্ট করা উচিত। সেখানে আপনি স্টাইল এবং কর্মক্ষমতা পরামর্শ পাবেন।
উইনস্টন ইওয়ার্ট

এটি সমস্যার খুব চালাক সমাধান। নির্মাণ ব্যতীত চেষ্টা করার পরিবর্তে, আমি করব: a_index = index.get (7) যা কী না পাওয়া গেলে ডিফল্ট হবে না will
মুরস্প্প 1

14

মূল প্রশ্নটি ছিল:

কোনও তালিকায় কোনও মান বিদ্যমান (লক্ষ লক্ষ মান সহ একটি তালিকা) এবং এর সূচকটি কী কী তা জানার দ্রুততম উপায় কী?

সুতরাং দুটি জিনিস খুঁজে পেতে হবে:

  1. তালিকার একটি আইটেম, এবং
  2. সূচকটি কী (তালিকায় থাকলে)।

এর দিকে, আমি সমস্ত ক্ষেত্রে সূচকগুলি গণনা করতে @ xslittlegrass কোডটি সংশোধন করেছি এবং একটি অতিরিক্ত পদ্ধতি যুক্ত করেছি।

ফলাফল

এখানে চিত্র বর্ণনা লিখুন

পদ্ধতিগুলি হ'ল:

  1. ইন - মূলত যদি এক্স ইন বি: রিটার্ন b.index (x)
  2. চেষ্টা করুন - বি.আইনডেক্স (এক্স) এ চেষ্টা করুন / ধরুন (এক্স-কে বি তে পরীক্ষা করতে হবে)
  3. সেট - মূলত x সেটে x (b): রিটার্ন b.index (x)
  4. দ্বিখণ্ডিত - এর সূচির সাথে বিটিকে সাজান, সাজানো (খ) এর জন্য বাইনারি অনুসন্ধান করুন। @ Xslittlegrass এর কাছ থেকে নোট মোড যিনি মূল খের পরিবর্তে বাছাই করা খে সূচকটি ফেরান)
  5. বিপরীত - খ জন্য একটি বিপরীত অনুসন্ধান অভিধান গঠন; তারপরে d [x] x এর সূচক সরবরাহ করে।

ফলাফলগুলি দেখায় যে 5 পদ্ধতিটি সবচেয়ে দ্রুত।

মজার বিষয় হল চেষ্টা এবং সেট পদ্ধতিগুলি সময়ের সাথে সমান।


পরীক্ষার কোড

import random
import bisect
import matplotlib.pyplot as plt
import math
import timeit
import itertools

def wrapper(func, *args, **kwargs):
    " Use to produced 0 argument function for call it"
    # Reference https://www.pythoncentral.io/time-a-python-function/
    def wrapped():
        return func(*args, **kwargs)
    return wrapped

def method_in(a,b,c):
    for i,x in enumerate(a):
        if x in b:
            c[i] = b.index(x)
        else:
            c[i] = -1
    return c

def method_try(a,b,c):
    for i, x in enumerate(a):
        try:
            c[i] = b.index(x)
        except ValueError:
            c[i] = -1

def method_set_in(a,b,c):
    s = set(b)
    for i,x in enumerate(a):
        if x in s:
            c[i] = b.index(x)
        else:
            c[i] = -1
    return c

def method_bisect(a,b,c):
    " Finds indexes using bisection "

    # Create a sorted b with its index
    bsorted = sorted([(x, i) for i, x in enumerate(b)], key = lambda t: t[0])

    for i,x in enumerate(a):
        index = bisect.bisect_left(bsorted,(x, ))
        c[i] = -1
        if index < len(a):
            if x == bsorted[index][0]:
                c[i] = bsorted[index][1]  # index in the b array

    return c

def method_reverse_lookup(a, b, c):
    reverse_lookup = {x:i for i, x in enumerate(b)}
    for i, x in enumerate(a):
        c[i] = reverse_lookup.get(x, -1)
    return c

def profile():
    Nls = [x for x in range(1000,20000,1000)]
    number_iterations = 10
    methods = [method_in, method_try, method_set_in, method_bisect, method_reverse_lookup]
    time_methods = [[] for _ in range(len(methods))]

    for N in Nls:
        a = [x for x in range(0,N)]
        random.shuffle(a)
        b = [x for x in range(0,N)]
        random.shuffle(b)
        c = [0 for x in range(0,N)]

        for i, func in enumerate(methods):
            wrapped = wrapper(func, a, b, c)
            time_methods[i].append(math.log(timeit.timeit(wrapped, number=number_iterations)))

    markers = itertools.cycle(('o', '+', '.', '>', '2'))
    colors = itertools.cycle(('r', 'b', 'g', 'y', 'c'))
    labels = itertools.cycle(('in', 'try', 'set', 'bisect', 'reverse'))

    for i in range(len(time_methods)):
        plt.plot(Nls,time_methods[i],marker = next(markers),color=next(colors),linestyle='-',label=next(labels))

    plt.xlabel('list size', fontsize=18)
    plt.ylabel('log(time)', fontsize=18)
    plt.legend(loc = 'upper left')
    plt.show()

profile()

আপনার বিবরণে টাইপ করুন ("বিপরীত লুপ আপ" হওয়া উচিত "বিপরীত অনুসন্ধান," না?)
ক্যাম ইউ

@ ক্যামু - হ্যাঁ, এটি সংশোধন করেছেন। লক্ষ্য করার জন্য ধন্যবাদ।
ড্যারিলজি

7

মনে হচ্ছে আপনার অ্যাপ্লিকেশনটি ব্লুম ফিল্টার ডেটা স্ট্রাকচার ব্যবহার করে সুবিধা অর্জন করতে পারে।

সংক্ষেপে, একটি ব্লুম ফিল্টার লুক আপনাকে খুব তাড়াতাড়ি বলতে পারে যদি কোনও মান নির্দিষ্টভাবে সেটটিতে উপস্থিত না হয়। অন্যথায়, আপনি তালিকাতে পজিবলাইট হতে পারে এমন একটি মানের সূচক পেতে একটি ধীর গতির চেহারা করতে পারেন। সুতরাং আপনার অ্যাপ্লিকেশন যদি প্রায়শই "পাওয়া যায় না" ফলাফলটি পেতে থাকে তবে "পাওয়া" ফলাফলটি পেতে পারে, আপনি একটি ব্লুম ফিল্টার যুক্ত করে একটি গতি বাড়িয়ে দেখতে পারেন।

বিশদগুলির জন্য, উইকিপিডিয়া ব্লুম ফিল্টারগুলি কীভাবে কাজ করে তার একটি ভাল ওভারভিউ দেয় এবং "পাইথন ব্লুম ফিল্টার লাইব্রেরি" এর জন্য একটি ওয়েব অনুসন্ধান কমপক্ষে কয়েকটি কার্যকর বাস্তবায়ন সরবরাহ করে।


7

সচেতন যে হতে inঅপারেটর পরীক্ষা না শুধুমাত্র সমতা ( ==) কিন্তু পরিচয় ( is), inজন্য যুক্তিবিজ্ঞান listগুলি হল প্রায় সমতুল্য নিম্নলিখিত (এটা আসলে সি পাইথন এবং না যদিও লেখা, অন্তত CPython মধ্যে):

for element in s:
    if element is target:
        # fast check for identity implies equality
        return True
    if element == target:
        # slower check for actual equality
        return True
return False

বেশিরভাগ পরিস্থিতিতে এই বিবরণটি অপ্রাসঙ্গিক, তবে কিছু পরিস্থিতিতে এটি একটি পাইথন নবজাতককে অবাক করে দিতে পারে, উদাহরণস্বরূপ, নিজের সমান না হওয়ারnumpy.NAN অস্বাভাবিক সম্পত্তি রয়েছে :

>>> import numpy
>>> numpy.NAN == numpy.NAN
False
>>> numpy.NAN is numpy.NAN
True
>>> numpy.NAN in [numpy.NAN]
True

এই অস্বাভাবিক মামলার মধ্যে পার্থক্য করার জন্য আপনি যেমন ব্যবহার করতে any()পারেন:

>>> lst = [numpy.NAN, 1 , 2]
>>> any(element == numpy.NAN for element in lst)
False
>>> any(element is numpy.NAN for element in lst)
True 

এর inজন্য লজিকটি নোট করুন :listany()

any(element is target or element == target for element in lst)

যাইহোক, আমি জোর দেওয়া উচিত যে এটি একটি প্রান্তের কেস, এবং বিস্তৃত ক্ষেত্রে inঅপারেটর অত্যন্ত অনুকূলিত হয় এবং ঠিক আপনি যা চান তা অবশ্যই (একটিতে listবা একটি দিয়ে set)।


ন্যান == নান প্রত্যাবর্তন করা এ সম্পর্কে অস্বাভাবিক কিছু নয়। এটি আইইইই 754 স্ট্যান্ডার্ডে সংজ্ঞায়িত আচরণ।
টমিডি


2

@ উইনস্টন ইওয়ার্টের দ্রবণ খুব বড় তালিকাগুলির জন্য একটি বৃহত গতি অর্জন করে, তবে এই স্ট্যাকওভারফ্লো উত্তরটি চেষ্টা করে: / বাদে: / অন্যথায়: নির্মাণ ব্যতীত গতি কমিয়ে দিলে যদি কেবল শাখাটি প্রায়শই পৌঁছে যায়। একটি বিকল্প হ'ল .get()ডিকের পদ্ধতির সুবিধা নেওয়া :

a = [4,2,3,1,5,6]

index = dict((y, x) for x, y in enumerate(a))

b = index.get(7, None)
if b is not None:
    "Do something with variable b"

.get(key, default)পদ্ধতিটি কেবল মামলার জন্য যখন আপনি গ্যারান্টি দিতে পারবেন না যে কোনও কী ডিকটিতে থাকবে। তাহলে কী হয় বর্তমান, এটা (করবে মান dict[key]), কিন্তু যখন তা না হয়, .get()আপনার ডিফল্ট মান (এখানে ফেরৎ None)। আপনার অবশ্যই এই ক্ষেত্রে নিশ্চিত করতে হবে যে নির্বাচিত ডিফল্টটি থাকবে না a


1

এটি কোড নয়, খুব দ্রুত অনুসন্ধানের জন্য অ্যালগরিদম।

আপনার তালিকা এবং আপনি যে মানটির সন্ধান করছেন তা যদি সমস্ত নম্বর হয় তবে এটি বেশ সোজা। যদি স্ট্রিংগুলি: নীচে দেখুন:

  • "এন" আপনার তালিকার দৈর্ঘ্য হতে দিন
  • Oচ্ছিক পদক্ষেপ: আপনার যদি উপাদানের সূচক প্রয়োজন হয়: উপাদানগুলির বর্তমান সূচক (0 থেকে এন -1) সহ তালিকায় একটি দ্বিতীয় কলাম যুক্ত করুন - পরে দেখুন
  • আপনার তালিকা বা এটির একটি অনুলিপি অর্ডার করুন (.Sort ())
  • লুপ মাধ্যমে:
    • আপনার নম্বরটি তালিকার n / 2 তম উপাদানের সাথে তুলনা করুন
      • বৃহত্তর হলে সূচকগুলির মধ্যে n / 2-n এর মধ্যে আবার লুপ করুন
      • যদি ছোট হয় তবে 0-n / 2 সূচকের মধ্যে আবার লুপ করুন
      • যদি একই: আপনি এটি খুঁজে পেয়েছেন
  • আপনি এটি না পেয়ে বা কেবল ২ টি সংখ্যা না পাওয়া পর্যন্ত তালিকাটি সংকীর্ণ রাখুন (আপনি যেটির সন্ধান করছেন তার নীচে এবং উপরে)
  • 1.000.000 (লগ (2) এন যথাযথ হতে) এর তালিকার জন্য 19 টি ধাপে এটি কোনও উপাদান খুঁজে পাবে

আপনারও যদি আপনার নম্বরটির মূল অবস্থান প্রয়োজন হয় তবে এটি দ্বিতীয়, সূচী কলামে সন্ধান করুন।

যদি আপনার তালিকাটি সংখ্যার তৈরি না হয় তবে পদ্ধতিটি এখনও কাজ করে এবং দ্রুততম হবে তবে আপনাকে কোনও ক্রিয়া সংজ্ঞায়িত করতে হবে যা স্ট্রিংগুলি তুলনা / অর্ডার করতে পারে।

অবশ্যই, এর জন্য বাছাই করা () পদ্ধতির বিনিয়োগের প্রয়োজন, তবে আপনি যদি পরীক্ষার জন্য একই তালিকাটি পুনরায় ব্যবহার করতে থাকেন তবে এটি মূল্যবান হতে পারে।


26
আপনি উল্লেখ করতে ভুলে গেছেন যে আপনি যে অ্যালগরিদম ব্যাখ্যা করেছেন তা একটি সাধারণ বাইনারি অনুসন্ধান।
diugalde

0

কারণ প্রশ্নটি সর্বদা দ্রুত প্রযুক্তিগত উপায় হিসাবে বোঝার কথা নয় - আমি সবসময় বোঝার / লেখার সর্বাধিক সোজা দ্রুততম উপায়টি প্রস্তাব করি : একটি তালিকা বোধগম্যতা, এক-রেখার

[i for i in list_from_which_to_search if i in list_to_search_in]

আমার কাছে list_to_search_inসমস্ত আইটেম ছিল এবং আমি আইটেমের সূচকগুলি ফিরিয়ে দিতে চেয়েছিলাম list_from_which_to_search

এটি সূচকগুলি একটি দুর্দান্ত তালিকায় ফেরত দেয়।

এই সমস্যাটি যাচাই করার অন্যান্য উপায় রয়েছে - তবে তালিকা বোঝার যথেষ্ট তাড়াতাড়ি তাত্ক্ষণিকভাবে সমস্যা সমাধানের জন্য এটি যথেষ্ট তাড়াতাড়ি লেখার বাস্তবতাকে যুক্ত করে।


-2

আমার জন্য এটি ছিল 0.030 সেকেন্ড (বাস্তব), 0.026 সেকেন্ড (ব্যবহারকারী) এবং 0.004 সেকেন্ড (সিস)।

try:
print("Started")
x = ["a", "b", "c", "d", "e", "f"]

i = 0

while i < len(x):
    i += 1
    if x[i] == "e":
        print("Found")
except IndexError:
    pass

-2

অ্যারেতে দুটি উপাদান বিদ্যমান রয়েছে কিনা তা যাচাই করার কোড:

n = len(arr1)
for i in arr1:
    if k%i==0:
        print(i)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.