পাইথনের কি বাছাই করা তালিকা রয়েছে?


128

যার সাহায্যে আমি এর সাথে একটি কাঠামো বলতে চাই:

  • x.push()অপারেশনের জন্য ও (লগ এন) জটিলতা
  • ও (লগ এন) উপাদান খুঁজে বের করার জটিলতা
  • ও (এন) গণনা করা জটিলতা list(x)যা বাছাই করা হবে

পারফরম্যান্স সম্পর্কে আমার একটি সম্পর্কিত প্রশ্ন ছিল list(...).insert(...)যা এখন এখানে


memcpyএখনও একটি ও (এন) অপারেশন। আমি জানি না পাইথন ঠিক কীভাবে তালিকা প্রয়োগ করে তবে আমার বাজিটি হ'ল এগুলি মঞ্জুরিযুক্ত স্মৃতিতে (অবশ্যই লিঙ্কযুক্ত তালিকার মতো নয়)। যদি তা প্রকৃতপক্ষে হয় তবে আপনি যে সন্নিবেশটি bisectপ্রদর্শন করেছেন তা ব্যবহারের জটিলতা ও (এন) হবে
স্টেফান202

2
দুঃখজনকভাবে বাক্স আউট না। তবে গ্রান্ট জেনকের सॉোর্টড কন্টেইনার লাইব্রেরি দুর্দান্ত। stackoverflow.com/a/22616929/284795
কর্নেল আতঙ্ক

উত্তর:


52

স্ট্যান্ডার্ড পাইথন তালিকাটি কোনও আকারে বাছাই করা হয় না। স্ট্যান্ডার্ড হ্যাপক মডিউলটি বিদ্যমান তালিকায় ও (লগ এন) এ সংযুক্ত করতে এবং ও (লগ এন) এর ক্ষুদ্রতমটিকে সরাতে ব্যবহার করা যেতে পারে, তবে আপনার সংজ্ঞা অনুসারে বাছাই করা তালিকা নয়।

পাইথনের জন্য ভারসাম্যযুক্ত গাছগুলির বিভিন্ন বাস্তবায়ন রয়েছে যা আপনার প্রয়োজনীয়তা পূরণ করে, যেমন rbtree , RBTree , বা pyavl


1
; Rbtree জন্য +1, এটা খুব ভাল কাজ করে (না বিশুদ্ধ পাইথন, না এত সহজ সম্ভবত স্থাপন করতে কিন্তু নেটিভ কোড রয়েছে)
উইল

12
सॉ োর্টকন্টেইনারগুলি পারফরম্যান্স তুলনার সাথে খাঁটি পাইথন এবং দ্রুত-সি-সি (আরবিট্রি এর মতো)।
গ্রান্টজে

"আপনার সংজ্ঞা অনুসারে বাছাই করা তালিকা নয়" " তা কিভাবে?
কর্নেল আতঙ্ক

4
heapq শুধুমাত্র ক্ষুদ্রতম উপাদান সন্ধান করতে দেয়; ওপি এমন কাঠামোর জন্য জিজ্ঞাসা করছিল যা ও (লগ এন) এর যে কোনও উপাদান খুঁজে পেতে পারে, যা গাদা নেই।
মার্টিন বনাম লুইস

70

আপনার বিগ-ও প্রয়োজনীয়তার কোনও কারণ আছে কি? বা আপনি কি চান যে এটি দ্রুত হোক? Sortedcontainers মডিউল বিশুদ্ধ-পাইথন এবং দ্রুত (blist এবং rbtree মত দ্রুত হিসাবে-সি বাস্তবায়নের হিসেবে) হয়।

কর্মক্ষমতা তুলনা অনুষ্ঠানগুলি এটি দ্রুত বা blist এর অনুসারে সাজানো তালিকা ধরনের সঙ্গে সমাবস্থা benchmarks। আরও মনে রাখবেন যে rbtree, RBTree, এবং পাইএভিএল সাজানো ডিক এবং সেট প্রকার সরবরাহ করে তবে সাজানো তালিকার প্রকার নেই।

যদি পারফরম্যান্সের প্রয়োজনীয়তা থাকে তবে সর্বদা মানদণ্ড মনে রাখবেন। একটি মডিউল যা বিগ-ও স্বরলিপি সহ দ্রুত হওয়ার দাবিটি প্রমাণ করে তা সন্দেহ হওয়া উচিত যতক্ষণ না এটি বেঞ্চমার্কের তুলনাও দেখায়।

দাবি অস্বীকার : আমি পাইথন সোর্টার্ড কন্টেইনার মডিউলটির লেখক।


স্থাপন:

pip install sortedcontainers

ব্যবহার:

>>> from sortedcontainers import SortedList
>>> l = SortedList()
>>> l.update([0, 4, 1, 3, 2])
>>> l.index(3)
3
>>> l.add(5)
>>> l[-1]
5

4
প্রকৃতপক্ষে আমি দ্বিখণ্ডিতের বিপরীতে सॉোর্টড কন্টেইনারদের তুলনা করেছি: 0.0845024989976সোর্টার্ডলিস্ট.এডডি () বনাম 0.596589182518বাইসেক্ট.ইনসোর্ট () এর জন্য, এইভাবে গতিতে 7x এর পার্থক্য! এবং আমি আশা করি তালিকার দৈর্ঘ্যের সাথে গতির ফাঁক বাড়বে যেহেতু বাছাই করা কন্টেইনারগুলি সারণি ও (লগ এন) এ কাজ করে যখন বাইসেক্ট.ইনসোর্ট () ও (এন) এ কাজ করে।
গৌরবজনক

1
@ গৌরবময় কারণ দ্বিখণ্ডিত এখনও একটি তালিকা ব্যবহার করে, সুতরাং সন্নিবেশটি রয়ে গেছেO(n)
njzk2

34

যদিও আমি এখনও পাইগন তালিকার বেসিক ক্রিয়াকলাপগুলির "বিগ ও" গতিটি কখনও চেক করি নি, bisectপ্রমিত মডিউলটি সম্ভবত এই প্রসঙ্গে উল্লেখযোগ্য:

import bisect
L = [0, 100]

bisect.insort(L, 50)
bisect.insort(L, 20)
bisect.insort(L, 21)

print L
## [0, 20, 21, 50, 100]

i = bisect.bisect(L, 20)
print L[i-1], L[i]
## 20, 21

পুনশ্চ. আহ, দুঃখিত, bisectরেফারেন্সযুক্ত প্রশ্নে উল্লেখ করা হয়েছে। তবুও, আমি মনে করি এই তথ্যটি যদি এখানে আসে তবে এটি খুব বেশি ক্ষতি হবে না)

PPS। এবং সিপাইথন তালিকাগুলি আসলে অ্যারে (না, বলুন, স্কিপলিস্ট বা ইত্যাদি)। ওয়েল, আমি অনুমান করি তাদের কিছু সাধারণ হতে হবে তবে আমার হিসাবে নামটি কিছুটা বিভ্রান্তিকর।


সুতরাং, যদি আমার ভুল না হয় তবে দ্বিখণ্ডিত / তালিকার গতি সম্ভবতঃ

  • একটি ধাক্কা জন্য (): ও (এন) সবচেয়ে খারাপ ক্ষেত্রে;
  • অনুসন্ধানের জন্য: যদি আমরা অ্যারে সূচকের গতিটিকে ও (1) হিসাবে বিবেচনা করি তবে অনুসন্ধানটি ও (লগ (এন)) ক্রিয়া হওয়া উচিত;
  • তালিকা তৈরির জন্য: ও (এন) তালিকা অনুলিপি করার গতি হওয়া উচিত, অন্যথায় এটি একই তালিকার জন্য ও (1))

Upd। মন্তব্যে আলোচনার পরে, আমাকে এই এসও প্রশ্নগুলির সাথে এখানে লিঙ্ক দিন: পাইথনের তালিকা কীভাবে প্রয়োগ করা হয় এবং পাইথন তালিকার কার্যকারিতার রানটাইম জটিলতা কী?


পুস্তক () ও (লগ এন) এ থাকা উচিত যেহেতু তালিকাটি ইতিমধ্যে সাজানো হয়েছে।
ইস্তানী

1
হতে পারে আমার "ইনসার্ট অপের জন্য" বলা উচিত ছিল । যাইহোক, এটি প্রায় এক বছর আগে ছিল তাই এখন আমি সহজেই জিনিসগুলি মিশ্রিত করতে পারি বা কিছু মিস করতে পারি
ョ ー ジ

আপনি সর্বদা ও (লগ এন) এর বাছাই করা তালিকায় একটি মান সন্নিবেশ করতে পারেন, বাইনারি অনুসন্ধান দেখুন। পুশ () একটি সন্নিবেশ অপারেশন হিসাবে সংজ্ঞায়িত করা হয়।
এস্তানি

2
সত্য। তবে সন্নিবেশের অবস্থানটি সন্ধান করার পরে অবশ্যই ও (লগ এন) অপস নেবে, প্রকৃত সন্নিবেশ (অর্থাত্ ডেটা কাঠামোর সাথে উপাদান যুক্ত করা) সম্ভবত সেই কাঠামোর উপর নির্ভর করে (একটি সাজানো অ্যারেতে কোনও উপাদান সন্নিবেশ করানোর কথা ভাবেন)। এবং হিসাবে পাইথন তালিকা আসলে অ্যারে হয় , এই হে (ঢ) সময় লাগতে পারে। মন্তব্যের আকারের সীমাবদ্ধতার কারণে, আমি উত্তরের পাঠ্য থেকে দুটি সম্পর্কিত এসও প্রশ্নের সাথে লিঙ্ক করব (উপরে দেখুন)।
ョ ー ジ

ভাল যুক্তি। পাইথনের অ্যারে হিসাবে পরিচালনা করা যেখানে আমি সচেতন ছিলাম না।
এস্তানি

7
import bisect

class sortedlist(list):
    '''just a list but with an insort (insert into sorted position)'''
    def insort(self, x):
        bisect.insort(self, x)

বাইসেক্ট.ইনসোর্ট () এ অন্তর্নিহিত সন্নিবেশ () হ'ল ও (এন)
জে 143

6

যদিও এটি (এখনও) কোনও কাস্টম অনুসন্ধান ক্রিয়াকলাপ সরবরাহ করে না, heapqমডিউলটি আপনার প্রয়োজন অনুসারে কাজ করতে পারে। এটি নিয়মিত তালিকা ব্যবহার করে একটি গাদা সারি প্রয়োগ করে। আপনাকে নিজের দক্ষ সদস্যপদ পরীক্ষা লিখতে হবে যা কাতার অভ্যন্তরীণ কাঠামোটি ব্যবহার করে (এটি ও (লগ এন) এ করা যেতে পারে , আমি বলব ...)। এর একটি খারাপ দিক রয়েছে: বাছাই করা তালিকাটি বের করার ক্ষেত্রে জটিলতা রয়েছে O (n লগ এন)


এটি ভাল কিন্তু দ্বিখণ্ডিত করা কঠিন।
ইলিয়া n।

3
কীভাবে একটি স্তূপে ও (লগ এন) সদস্যতার পরীক্ষা থাকতে পারে? আপনি যদি x এর মান সন্ধান করছেন, আপনি যদি এক্স এর চেয়ে বড় কিছু খুঁজে পান তবে একটি শাখা নীচে থামিয়ে দিতে পারেন, তবে x এর এলোমেলো মানের জন্য এটি পাতায় 50% হওয়ার সম্ভাবনা রয়েছে এবং আপনি সম্ভবত খুব বেশি ছাঁটাই করতে পারবেন না।
বাজার

1

আমি biscectবা sortedcontainersমডিউলগুলি ব্যবহার করব । আমি আসলেই অভিজ্ঞ নই, তবে আমি মনে করি heapqমডিউলটি কাজ করে। এটি কHeap Queue


0

পাইথনে আপনার নিজস্ব বাছাই করা তালিকাটি কার্যকর করা কঠিন নাও হতে পারে। নীচে ধারণার প্রমাণ:

import bisect

class sortlist:
    def __init__(self, list):
        self.list = list
        self.sort()
    def sort(self):
        l = []
        for i in range(len(self.list)):
            bisect.insort(l, self.list[i])
        self.list = l
        self.len = i
    def insert(self, value):
        bisect.insort(self.list, value)
        self.len += 1
    def show(self):
        print self.list
    def search(self,value):
        left = bisect.bisect_left(self.list, value)
        if abs(self.list[min([left,self.len-1])] - value) >= abs(self.list[left-1] - value):
            return self.list[left-1]
        else:
            return self.list[left]

list = [101, 3, 10, 14, 23, 86, 44, 45, 45, 50, 66, 95, 17, 77, 79, 84, 85, 91, 73]
slist = sortlist(list)
slist.show()
slist.insert(99)
slist.show()
print slist.search(100000000)
print slist.search(0)
print slist.search(56.7)

========= ফলাফল =============

[3, 10, 14, 17, 23, 44, 45, 45, 50, 66, 73, 77, 79, 84, 85, 86, 91, 95, 101]

[3, 10, 14, 17, 23, 44, 45, 45, 50, 66, 73, 77, 79, 84, 85, 86, 91, 95, 99, 101]

101

3

50

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.