Artikel

3.7: Membilang Multiset

3.7: Membilang Multiset



We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

3.7: Membilang Multiset

Bilangan multiset sehingga setiap nombor dari 1 hingga $ n $ dapat dinyatakan secara unik sebagai jumlah beberapa elemen multiset

Contohnya. Contohnya jika $ n = 5 $ maka $ <1,1,1,1,1 >, <1,2,2 >, <1,1,3 > $ adalah sah.

Walau bagaimanapun, $ S = <1,1,1,2 > $ tidak sah kerana 2 dapat dibentuk oleh kedua $ <1,1 > $ dan $ <2 > $ (iaitu, 2 dapat dinyatakan kerana kedua $ 2 = 1 + 1 $ dan $ 2 = 2 $), jadi syarat kedua tidak berlaku. Begitu juga 3 boleh dibentuk oleh $ <2,1 > $ dan $ <1,1,1 > $.

$ S = <1,2,4 $> juga tidak sah kerana semua nombor dari $ 1 $ hingga $ 5 $ boleh dibuat secara unik, tetapi jumlah unsur $ S $ tidak $ 5 $.

Saya sudah lama berusaha mencari algoritma yang baik untuk masalah ini tetapi tidak dapat menyelesaikannya. Ia dari codechef. Saya telah melihat beberapa penyelesaian yang dihantar tetapi saya masih tidak dapat mendapatkan logik untuk menyelesaikan masalah tersebut. NOTA: Had masa untuk soalan ialah 10 saat dan $ n & lt10 ^ 9 $

Untuk multiset saya akan menggunakan notasi $ S = <(a_1, c_1), (a_2, c_2). > $ $ a_i & lta_j $ jika $ i & ltj $, yang bermaksud $ a_i $ berlaku $ c_i $ kali dalam multiset S.

Hingga kini saya telah membuat beberapa kesimpulan

  • Elemen pertama multiset yang disusun yang diperlukan mestilah $ 1 $
  • Biarkan $ S = <1, a_2 cdots a_k > | a_1 leq a_2 cdots leq a_k $ menjadi satu set mengikuti dua sifat itu kemudian $ forall r & ltk a_ = a_r teks ( jumlah_^ ra_i) + 1 $
  • Biarkan $ S = <(1, c_1), (a_2, c_2) cdots (a_k, c_k) > | a_1 leq a_2 cdots leq a_k $, di mana $ a_i $ berlaku $ c_i $ kali, mengikuti sifat yang diperlukan maka dari kesimpulan di atas kita dapat mengatakan bahawa $ forall i a_i | n + 1 $ dan $ a_i | a_j $ jika $ j & gt i $.
    Bukti: $ a_ = (a_ic_i + a_i -1) + 1 Garis kanan a_i | a_$
  • Sekarang pertimbangkan $ S = < underbrace <1,1 cdots 1> _, d, d cdots d, dm_1, dm_1 cdots dm_1, dm_2, dm_2 cdots dm_2, cdots > $ iaitu semua nombor berikutnya selepas 1 akan menjadi gandaan $ d $. Oleh itu, biarkan $ f (n) $ menjadi jumlah multiset yang mungkin dan kemudian $ f (n) = sum_ f ( frac$ di mana saya menjumlahkan semua kemungkinan jumlah $ 1's $ ($ = d-1 $). Dengan istilah lain $ f (n-1) = g (n) = sum_g (d) $

Akhirnya masalah saya dikurangkan kepada ini - cari $ g (n) $ dengan cara yang cekap sehingga tidak melebihi had masa.


8.3.1. Objek ChainMap¶

Kelas ChainMap disediakan untuk menghubungkan sebilangan pemetaan dengan cepat sehingga mereka dapat dianggap sebagai satu unit. Selalunya jauh lebih pantas daripada membuat kamus baru dan menjalankan beberapa panggilan kemas kini ().

Kelas boleh digunakan untuk mensimulasikan ruang lingkup bersarang dan berguna dalam templating.

kelas koleksi. Peta Rantai ( * peta ) ¶

ChainMap mengelompokkan beberapa perintah atau pemetaan lain bersama-sama untuk membuat satu paparan yang boleh dikemas kini. Jika tidak peta ditentukan, satu kamus kosong disediakan supaya rantaian baru selalu mempunyai sekurang-kurangnya satu pemetaan.

Pemetaan yang mendasari disimpan dalam senarai. Senarai itu adalah umum dan boleh diakses atau dikemas kini menggunakan peta atribut. Tidak ada negeri lain.

Pencarian mencari pemetaan asas berturut-turut sehingga kunci dijumpai. Sebaliknya, penulisan, kemas kini, dan penghapusan hanya beroperasi pada pemetaan pertama.

ChainMap menggabungkan pemetaan yang mendasari dengan rujukan. Oleh itu, jika salah satu pemetaan yang mendasari diperbaharui, perubahan tersebut akan ditunjukkan dalam ChainMap.

Semua kaedah kamus biasa disokong. Di samping itu, terdapat peta atribut, kaedah untuk membuat subkonteks baru, dan sifat untuk mengakses semua kecuali pemetaan pertama:

Senarai pemetaan yang boleh dikemas kini oleh pengguna. Senarai disusun dari carian pertama hingga carian terakhir. Ini adalah satu-satunya keadaan yang tersimpan dan dapat diubah untuk mengubah pemetaan yang dicari. Senarai mesti mengandungi sekurang-kurangnya satu pemetaan.

Mengembalikan Peta Rantai baru yang berisi peta baru diikuti oleh semua peta dalam keadaan semasa. Sekiranya m ditentukan, ia akan menjadi peta baru di bahagian depan senarai pemetaan jika tidak ditentukan, kata kosong digunakan, sehingga panggilan ke d.new_child () bersamaan dengan: ChainMap (<>, * d. peta). Kaedah ini digunakan untuk membuat subkonteks yang dapat diperbaharui tanpa mengubah nilai dalam pemetaan induk.

Diubah dalam versi 3.4: Parameter m pilihan ditambahkan.

Harta yang mengembalikan Peta Rantai baru yang mengandungi semua peta dalam keadaan semasa kecuali yang pertama. Ini berguna untuk melangkau peta pertama dalam carian. Kes penggunaan serupa dengan yang digunakan untuk kata kunci bukan tempatan yang digunakan dalam ruang lingkup bersarang. Kes penggunaan juga selari dengan fungsi super () terbina dalam. Rujukan kepada d.parents adalah sama dengan: ChainMap (* d.maps [1:]).

  • Kelas MultiContext dalam pakej Enthought CodeTools mempunyai pilihan untuk menyokong penulisan ke setiap pemetaan dalam rantaian.
  • Kelas konteks Django & # 8217s untuk templat adalah rangkaian pemetaan yang hanya boleh dibaca. Ia juga menampilkan penekanan dan penambahan konteks yang serupa dengan kaedah new_child () dan harta ibu bapa ().
  • Resipi Nested Contexts mempunyai pilihan untuk mengawal sama ada penulisan dan mutasi lain hanya berlaku untuk pemetaan pertama atau pemetaan dalam rantai.
  • Versi Chainmap yang sangat mudah dibaca.

8.3.1.1. Contoh dan Resipi Peta Rantai¶

Bahagian ini menunjukkan pelbagai pendekatan untuk bekerja dengan peta berantai.

Contoh simulasi rantai carian dalaman Python & # 8217s:

Contoh membiarkan argumen baris perintah yang ditentukan pengguna lebih diutamakan daripada pemboleh ubah persekitaran yang seterusnya mendahului nilai lalai:

Contoh corak untuk menggunakan kelas ChainMap untuk mensimulasikan konteks bersarang:

Kelas ChainMap hanya membuat kemas kini (penulisan dan penghapusan) pada pemetaan pertama dalam rantai sementara pencarian akan mencari rantai penuh. Walau bagaimanapun, jika penulisan dan penghapusan mendalam diinginkan, mudah untuk membuat subkelas yang mengemas kini kunci yang terdapat lebih dalam rantai:


Kelas

Terdapat tujuh kelas baru yang disediakan:

Senarai Setel

Pemetaan

bijection Pemetaan satu lawan satu. RangeMap A pemetaan dari julat (nombor / tarikh / dll) IndexedDict Pemetaan yang menjaga susunan penyisipan dan membolehkan akses mengikut indeks.
Pengarang:Michael Lenzen
Hak cipta:2019 Michael Lenzen
Lesen:Lesen Apache, Versi 2.0
Halaman Utama Projek:
https://github.com/mlenzen/collections-extended

Ini adalah soalan gabungan bintang dan bar klasik.

Kita perlu mencari 4 nombor, iaitu 4-tupel bilangan bulat positif sehingga jumlahnya adalah 7. Jadi jumlah penyelesaiannya adalah:

Di mana $ k $ adalah jumlah mereka dan $ n $ adalah bilangan istilah dalam penjumlahan. Jadi untuk kes kami mempunyai:

Perhatikan bahawa beberapa penyelesaian ini adalah permutasi kerana $ (x, y, z, y) = (1,2,2,2) $ dan $ (x, y, z, y) = (2,1,2,2 ) $ dikira dua kali. Sekiranya anda mahukan penyelesaian seperti ini disertakan sekali, saya tidak dapat memikirkan cara yang lebih baik daripada mengira.

Ini hanyalah petunjuk untuk membantu anda mula memikirkan masalahnya. Mungkin ada cara yang lebih baik untuk melihatnya, tetapi anda juga boleh menghitung jumlah penyelesaiannya. Oleh itu, anda memulakan $ 1 + 1 + 1 + 4 = 7 1 + 1 + 2 + 3 = 7 1 + 1 + 3 + 2 = 7 1 + 1 + 4 + 1 = 7 1 + 2 + 1 + 3 = 7 1 + 2 + 2 + 2 = 7 vdot $

Mungkin cara yang lebih bijak untuk melakukannya adalah pertama kali menyedari bahawa $ x, y, z, t $ perlu dari $ <1,2,3,4 > $. Kemudian, ketahui berapa banyak kaedah yang boleh anda tambahkan sehingga mendapat $ 7 $. Anda dapat (Perhatikan misalnya bahawa jika satu nombor adalah $ 3 $, maka nombor yang lain mestilah $ 1 $ atau $ 2 $): $ 1, 1, 1, 4 1, 1, 2, 3 1, 2 , 2, 2. $ Sekiranya anda memilih $ 1,1,1,4 $ maka berapa cara anda boleh menambahkannya?

$ x + y + z + t = 7 $, tetapi kerana semuanya adalah bilangan bulat, kami menulis $ x = m + 1 $, $ y = n + 1 $, $ z = o + 1 $, dan $ t = p + 1 $ (di mana $ m, n, o, p $ adalah bilangan bulat bukan negatif). Kemudian $ m + n + o + p = 3 $. Terdapat tiga pilihan. Salah satunya ialah $ 3 $ dan yang lain $. Satu $ 2 $ dan satu lagi $ 1 $ atau tiga $ 1 $.

Kes pertama memberikan penyelesaian $ 4 $, $ 12 $ kedua (bilangan pasang subset yang dipesan nombor $ $) dan ketiga $ 4 $. Oleh itu, terdapat keseluruhan penyelesaian $ 20 $.


Algoritma Berfungsi

Entri dalam Segitiga Pascal tradisional (PT dari sini keluar) mewakili pekali binomial di mana baris segitiga adalah bilangan elemen dalam set anda dan lajur adalah panjang kombinasi yang ingin anda hasilkan. Pembinaan segitiga adalah kunci bagaimana kita akan mengatasi masalah yang dihadapi.

Sekiranya anda perhatikan bahawa untuk PT tradisional, untuk mendapatkan entri tertentu, katakan (i, j) di mana i ialah barisan dan j adalah lajur, anda mesti menambah entri (i - 1, j - 1) dan (i - 1, j). Berikut adalah gambaran.

Kita boleh memperluasnya ke multiset umum di mana setiap elemen diulang sebilangan kali. Mari kita pertimbangkan beberapa contoh.

Contoh 1: v1 = <1, 2, 2>, v2 = <1, 2, 2, 3, 3, 3>, dan v3 =

Di bawah ini kita mempunyai semua kemungkinan kombinasi v1 pilih 1 - 3 dan juga v2 memilih 1 - 6.

Mari kita tuliskan jumlah kombinasi untuk semua k untuk kedua-dua v1 dan v2.

Saya akan memberi anda jumlah kombinasi untuk semua k v3 (Saya akan menyerahkannya kepada pembaca untuk menghitungnya).

Kami menggabungkan hasil di atas dengan cara yang istimewa dan perhatikan bahawa perkara-perkara mulai kelihatan sangat biasa.

Kami menambah beberapa sebagai pemegang tempat untuk menyelesaikan PT yang diubah suai ini

Apakah maksud ini? Agak jelas bahawa nombor di setiap baris berturut-turut adalah gabungan nombor di baris sebelumnya. Tetapi bagaimana.

Kami membiarkan kekerapan setiap elemen membimbing kami.

Sebagai contoh, untuk mendapatkan baris ketiga yang mewakili bilangan kombinasi v2 pilih 1 - 6 (mengabaikan 1 yang pertama), kita melihat ke baris 2. Oleh kerana kekerapan elemen ke-3 adalah 3, kita menambah 4 elemen (3 + 1 .. sama seperti dengan pekali binomial untuk mencari bilangan kombinasi set dengan elemen yang berbeza, kami menambah 2 entri bersama atau 1 + 1) pada baris di atas dengan lajur kurang dari atau sama dengan lajur yang kami dapati. Oleh itu, kami mempunyai:

Terus dengan logik ini, mari kita lihat apakah kita dapat memperoleh jumlah k-kombinasi untuk v3. Oleh kerana kekerapan elemen ke-4 adalah 4, kita perlu menambahkan 5 entri bersama.

Dan memang, kita mendapat bilangan yang betul k-kombinasi v3.

Anda akan menyedari bahawa kami membina vektor ini sehingga setiap vektor berturut-turut mengandungi vektor sebelumnya. Kami melakukan ini supaya kami dapat membina PT yang diubahsuai dengan betul. Ini serupa dengan PT tradisional di mana dengan setiap baris berturut-turut, kita hanya menambah satu nombor ke baris sebelumnya. PT yang diubah suai untuk vektor ini adalah:

Mari bina z2 pilih 6 dan z3 pilih 9 untuk melihat apakah kita betul:

Sebagai nota ringkas, baris pertama penahan tempat serupa dengan baris kedua PT tradisional (iaitu 1 1). Secara longgar (lihat kod untuk kes tepi), jika elemen pertama mempunyai kekerapan m, baris pertama PT yang diubah akan mengandungi m + 1 yang.


Rujukan

Andrews, G.E .: Teori Partition. Cambridge University Press, Cambridge (1998)

Andrews, G.E., Eriksson, K.: Integer Partitions, edisi ke-2. Cambridge University Press, Cambridge (2010)

Andrica, D.: Hasil gabungan mengenai produk dua atau lebih derivatif. Lembu. Matematik Calcutta. Soc. 92(4), 299–304 (2000)

Andrica, D., Ionaşcu, E.J .: Beberapa hubungan yang tidak dijangka antara Analisis dan Kombinasi. Dalam: Rassias, T.M., Pardalos, P. (eds.) Matematik Tanpa Batas. Topik dalam Matematik Tulen, hlm 1–20. Springer, New York (2014)

Andrica, D., Ionaşcu, E.J .: Persamaan signum untuk urutan Erdös – Surányi. Bilangan bulat 15A, 1–9 (2015)

Andrica, D., Tomescu, I .: Mengenai urutan integer yang berkaitan dengan produk fungsi trigonometri, dan kaitannya dengan kombinasi. J. Integer Seq. 5, Artikel 02.2.4 (2002)

Andrica, D., Bagdasar O .: Beberapa komen mengenai 3-partisi multiset. Prosiding IMA TCDM'18 ke-2. Elektron. Nota Matematik diskrit. 70, 1–8 (2018)

Andrica, D., Bagdasar, O .: Urutan Berulang: Hasil Utama. Aplikasi dan Masalah. Springer, Berlin (2020)

Andrica, D., Bagdasar, O., Ţurcaş, G.C .: Bilangan partisi satu set dan persamaan Diophantine superelliptik. Dalam: Raigorodskii, A.M., Rassias, M.T. (eds.) Matematik dan Aplikasi Diskrit. Pengoptimuman dan Aplikasinya, vol. 165, hlm. 35–55. Springer, Cham (2020)

Andrica, D., Ţurcaş, G.C .: Persamaan Diophantine elips dari kajian partisi. Belajar. Univ. Matematik Babeş-Bolyai. 70(3), 349–356 (2019)

Bagdasar, O., Andrica, D.: Hasil dan dugaan baru pada 2 partisi multiset. Prosiding ICMSAO'17 ke-7, IEEE, hlm. 1–5 (2017)

Bender, E.A .: Pembahagian multiset. Bijak. Matematik. 9, 301–311 (1974)

Bender, E.A., Devitt, J.S., Richmond, L.S .: Partition of multiset II. Bijak. Matematik. 50, 1–8 (1984)

Erdös, P.: Pada bukti asas beberapa formula asimptotik dalam teori partisi. Ann. Matematik. 43(2), 437–450 (1942)

Garey, M.R., Johnson, D.S .: Hasil kerumitan untuk penjadualan multiprosesor di bawah kekangan sumber. SIAM J. Comput. 4, 397–411 (1975)

Garey, M.R., Johnson, D.S .: Komputer dan Kebolehpasaran Panduan untuk Teori Kelengkapan NP. Freeman, San Francisco (1979)

Pak, I .: Partition bijections, tinjauan. Ramanujan J. 12, 5–75 (2006)

Sloane, N.J.A: Ensiklopedia On-Line Urutan Integer. https://oeis.org

Stanley, R.P .: Kumpulan Weyl, teorema Lefschetz yang keras dan harta benda Sperner. SIAM J. Algebr. Bijak. Kaedah 1, 168–184 (1980)

Sullivan, B.D .: Pada dugaan Andrica dan Tomescu. J. Integer Seq. 16, Artikel 13.3.1 (2013)

Wilf, H .: Menjana fungsi. Akademik Akhbar, New York (1994)


Cara termudah untuk memperkenalkan ccc adalah dengan menunjukkan pelbagai contoh pengiraan dari baris perintah.

ccc selalu dipanggil dengan cara berikut:

Dalam semua contoh di bawah ini, perhatikan betapa mudahnya menyatakan kekangan yang sebaliknya memerlukan penulisan kod yang rumit, atau melakukan aritmetik berulang di atas kertas.

Melukis

ccc dapat memberitahu anda kemungkinan memilih jumlah item tertentu dari koleksi (sama ada dengan atau tanpa penggantian).

  • 3 guli merah (: red_circle :: red_circle :: red_circle :)
  • 5 guli hitam (: black_circle :: black_circle :: black_circle :: black_circle :: black_circle :)
  • 7 guli biru (: large_blue_circle :: large_blue_circle :: large_blue_circle :: large_blue_circle :: large_blue_circle :: large_blue_circle :: large_blue_circle :)

Untuk menyelesaikannya dengan ccc kita dapat menentukan dengan mudah koleksi kita ambil dari, ukuran undian yang kami buat, dan mana-mana kekangan semasa undian:

Ini meletakkan kemungkinan menang (tidak melukis marmer biru) di 2/39, jadi mungkin kita akan menang sekali setiap 19 atau lebih percubaan.

Perhatikan betapa mudahnya menentukan kekangan. Hanya nama item (biru) dan jumlah yang dikehendaki (0). Sebarang pengendali perbandingan boleh digunakan (==,! =, & Lt, & lt =, & gt, & gt =).

Sekiranya kami ingin membiarkan guli diganti setelah setiap undian, kami akan menambahkan bendera --replace.

Kami dapat menentukan kekangan yang lebih rumit mengenai perkara yang ingin kami ambil dari beg:

  • kedua-dua guli putih (: white_circle :: white_circle :), dan
  • sekurang-kurangnya 1 marmar hitam (: lingkaran_ hitam:+)

Peluang kita untuk menang adalah 3/119 menurut ccc, jadi kami menjangkakan akan menang sekali setiap 40 percubaan.

Anda dapat melihat bahawa untuk menyatakan banyak kekangan pada undian kami, kami hanya menggunakan koma, untuk memisahkannya.

Terakhir, adalah mungkin untuk menggunakan atau (beberapa kali) dalam kekangan:

  • 3 guli merah (: red_circle :: red_circle :: red_circle :) atau
  • 1 marmar putih, 1 hitam dan 1 biru (: white_circle :: black_circle :: large_blue_circle :)

Kebarangkalian adalah 0.1.

Multiset

Multiset adalah koleksi yang tidak tersusun (seperti set) di mana item boleh muncul berkali-kali.

  • kurang daripada 10 epal (: green_apple :), dan
  • sekurang-kurangnya 5 pisang (: pisang :), dan
  • bilangan anggur tidak 13 (: anggur :), dan
  • ada sebilangan besar strawberi (: strawberi :)?

Jawapannya ialah 406.

Pengendali modulo (%) yang digunakan di atas memberikan kemudahan untuk menyelesaikan masalah pertukaran duit syiling, seperti:

Mata wang UK mempunyai syiling berikut:

1p, 2p, 5p, 10p, 20p, 50p, £ 1 (100p) dan £ 2 (200p)

Berapa banyak cara yang boleh dibuat £ 5 dengan menggunakan sejumlah wang syiling?

rujuk Masalah Euler Projek 31

Jawapannya dikira dalam beberapa saat sebagai 6,295,434 cara yang berbeza.

Kami juga boleh membuat pengecualian tambahan pada duit syiling, seperti mengehadkan frekuensi penggunaan duit syiling.

Permutasi

Permutasi perkataan dapat dihitung sebagai berikut:

Disana ada 34650 permutasi unik sungai / negeri yang terkenal ini.

Bagaimana jika kita hanya menghitung permutasi di mana contoh huruf yang sama tidak berdekatan satu sama lain?

Dengan menggunakan kekangan 'no_adjacent', jawapannya kembali dengan segera 2016. Kepantasan pengiraan ini adalah berkat penggunaan Generalized Larguerre Polynomials.

Kita juga dapat menganggap huruf-huruf itu dapat dibezakan (bendera -sama-sama) untuk menyelesaikan jenis masalah yang berkaitan:

Lima pasangan akan duduk berturut-turut. Berapa banyak cara mereka boleh duduk sehingga tidak ada pasangan yang duduk bersama?

1,263,360 cara-cara.

ccc membolehkan gangguan (permutasi di mana tidak ada item yang menduduki tempat asalnya) dihitung.

Lima pasangan menarik nama dari topi. Apakah kebarangkalian tidak ada yang melukis nama mereka sendiri, atau nama pasangan mereka?

Ternyata hanya ada 0.121 kebarangkalian ini berlaku.

Urutan

Urutan adalah koleksi barang yang dipesan.

Berapa banyak urutan 30 huruf yang boleh anda buat dengan menggunakan tidak lebih daripada 20 setiap satu A, B dan C?

Jawapannya banyak: ada 205,863,750,414,990 urutan sedemikian.


3.7: Membilang Multiset

Modul ini mengimplementasikan jenis data kontena khas yang menyediakan alternatif untuk bekas umum tujuan Python,: class: `ict`,: class: `list`,: class:` set`, dan: class: `tuple`.

: func: `bernamatuple` fungsi kilang untuk membuat subkelas tuple dengan medan bernama
: kelas: `deque` bekas seperti senarai dengan cepat ditambahkan dan muncul di kedua-dua hujungnya
: class: `ChainMap` kelas seperti untuk membuat satu paparan daripada pelbagai pemetaan
: kelas: `Kaunter` menentukan subkelas untuk mengira objek yang boleh dicuci
: class: `OrderedDict` mendik subclass yang mengingat entri pesanan ditambahkan
: class: `defaultdict` perintah subkelas yang memanggil fungsi kilang untuk membekalkan nilai yang hilang
: class: `UserDict` membungkus objek kamus untuk diklasifikasikan subclassing lebih mudah
: class: `UserList` membungkus objek senarai untuk senarai subkelas yang lebih mudah
: class: `UserString` membungkus objek rentetan untuk subkelas rentetan yang lebih mudah

A: class: `ChainMap` class disediakan untuk menghubungkan sebilangan pemetaan dengan cepat sehingga mereka dapat dianggap sebagai satu unit. Selalunya jauh lebih pantas daripada membuat kamus baru dan menjalankan beberapa: met: `

Kelas boleh digunakan untuk mensimulasikan ruang lingkup bersarang dan berguna dalam templating.

A: class: `ChainMap` mengumpulkan beberapa imbuhan atau pemetaan lain bersama-sama untuk membuat satu paparan yang boleh dikemas kini. Jika tidak peta ditentukan, satu kamus kosong disediakan supaya rantaian baru selalu mempunyai sekurang-kurangnya satu pemetaan.

Pemetaan yang mendasari disimpan dalam senarai. Senarai itu adalah umum dan boleh diakses atau dikemas kini menggunakan peta atribut. Tidak ada negeri lain.

Pencarian mencari pemetaan asas berturut-turut sehingga kunci dijumpai. Sebaliknya, penulisan, kemas kini, dan penghapusan hanya beroperasi pada pemetaan pertama.

A: class: `ChainMap` menggabungkan pemetaan yang mendasari dengan rujukan. Oleh itu, jika salah satu pemetaan yang mendasari dikemas kini, perubahan tersebut akan ditunjukkan dalam: class: `ChainMap`.

Semua kaedah kamus biasa disokong. Di samping itu, terdapat peta atribut, kaedah untuk membuat subkonteks baru, dan sifat untuk mengakses semua kecuali pemetaan pertama:

Perhatikan, urutan lelaran a: class: `ChainMap ()` ditentukan dengan mengimbas pemetaan yang terakhir hingga pertama:

Ini memberikan susunan yang sama seperti siri panggilan: meth: `ict.update` bermula dengan pemetaan terakhir:

Bahagian ini menunjukkan pelbagai pendekatan untuk bekerja dengan peta berantai.

Contoh simulasi rantai carian dalaman Python:

Contoh membiarkan argumen baris perintah yang ditentukan pengguna lebih diutamakan daripada pemboleh ubah persekitaran yang seterusnya mendahului nilai lalai:

Contoh corak untuk menggunakan kelas: class: `ChainMap` untuk mensimulasikan konteks bersarang:

Kelas: class: `ChainMap` hanya membuat kemas kini (penulisan dan penghapusan) ke pemetaan pertama dalam rantai sementara pencarian akan mencari rantai penuh. Walau bagaimanapun, jika penulisan dan penghapusan mendalam diinginkan, mudah untuk membuat subkelas yang mengemas kini kunci yang terdapat lebih dalam rantai:

Alat kaunter disediakan untuk menyokong penghasilan yang pantas dan pantas. Sebagai contoh:

A: class: `Counter` adalah subclass: class: `ict` untuk mengira objek hash. Ini adalah koleksi di mana elemen disimpan sebagai kunci kamus dan kiraannya disimpan sebagai nilai kamus. Kiraan dibenarkan menjadi sebarang nilai bulat termasuk kiraan sifar atau negatif. Kelas: class: `Counter` serupa dengan beg atau multiset dalam bahasa lain.

Unsur dikira dari berulang kali atau dimulakan dari yang lain pemetaan (atau kaunter):

Objek penghitung mempunyai antara muka kamus kecuali bahawa mereka mengembalikan jumlah sifar untuk item yang hilang dan bukannya menaikkan: exc: `KeyError`:

Menetapkan kiraan ke sifar tidak menghilangkan elemen dari pembilang. Gunakan del untuk menghapusnya sepenuhnya:

Objek pembilang menyokong tiga kaedah di luar kaedah yang tersedia untuk semua kamus:

Kaedah kamus biasa tersedia untuk: class: Objek `Counter` kecuali dua yang berfungsi berbeza untuk pembilang.

Corak umum untuk bekerja dengan: class: Objek `Counter`:

Beberapa operasi matematik disediakan untuk menggabungkan: kelas: objek `Counter` untuk menghasilkan multiset (pembilang yang mempunyai kiraan lebih besar daripada sifar). Penambahan dan pengurangan menggabungkan pembilang dengan menambahkan atau mengurangkan kiraan unsur-unsur yang sesuai. Persimpangan dan kesatuan mengembalikan minimum dan maksimum jumlah yang sepadan. Setiap operasi dapat menerima input dengan jumlah yang ditandatangani, tetapi hasilnya tidak termasuk hasil dengan jumlah sifar atau kurang.

Penambahan dan pengurangan yang tidak tetap adalah jalan pintas untuk menambahkan pembilang kosong atau mengurangkan dari pembilang kosong.

Kaunter terutama dirancang untuk bekerja dengan bilangan bulat positif untuk mewakili kiraan berjalan, namun, berhati-hati untuk tidak menghalang kes penggunaan yang memerlukan jenis lain atau nilai negatif. Untuk membantu kes penggunaan tersebut, bahagian ini mendokumentasikan had minimum dan had jenis.

  • Kelas: class: `Counter` itu sendiri adalah subkelas kamus tanpa sekatan pada kunci dan nilainya. Nilai dimaksudkan sebagai angka yang mewakili jumlah, tetapi anda boleh simpan apa sahaja di medan nilai.
  • The: met: `

Mengembalikan objek deque baru yang diinisialisasi dari kiri ke kanan (menggunakan: meth: `append`) dengan data dari berulang kali. Sekiranya berulang kali tidak dinyatakan, deque baru kosong.

Deques adalah generalisasi tumpukan dan antrian (namanya diucapkan "dek" dan kependekan dari "double-end queue"). Deques menyokong keselamatan benang, tambahan memori yang efisien dan muncul dari kedua sisi deque dengan prestasi O (1) lebih kurang sama pada kedua-dua arah.

Walaupun: objek class: `list` menyokong operasi serupa, ia dioptimumkan untuk operasi panjang tetap yang cepat dan menanggung kos pergerakan memori O (n) untuk pop (0) dan operasi memasukkan (0, v) yang mengubah ukuran dan kedudukan perwakilan data yang mendasari.

Sekiranya maxlen tidak dinyatakan atau Tidak ada, deques boleh tumbuh dengan panjang sewenang-wenang. Jika tidak, deque itu dibatasi pada panjang maksimum yang ditentukan. Setelah deque panjang terikat penuh, apabila item baru ditambahkan, jumlah item yang sesuai akan dibuang dari hujung yang berlawanan. Deck panjang terikat memberikan fungsi yang serupa dengan penapis ekor di Unix. Mereka juga berguna untuk mengesan transaksi dan kumpulan data lain di mana hanya aktiviti terbaru yang menarik.

Objek deque menyokong kaedah berikut:

Objek deque juga menyediakan satu atribut baca sahaja:

Sebagai tambahan kepada perkara di atas, deques menyokong iterasi, pickling, len (d), terbalik (d), copy.copy (d), copy.deepcopy (d), ujian keahlian dengan: kata kunci: `in` operator, dan subskrip rujukan seperti d [-1]. Akses diindeks adalah O (1) di kedua hujungnya tetapi perlahan ke O (n) di tengah. Untuk akses rawak cepat, gunakan senarai sebagai gantinya.

Bermula dalam versi 3.5, deques menyokong __add __ (), __mul __ (), dan __imul __ ().

Bahagian ini menunjukkan pelbagai pendekatan untuk bekerja dengan deques.

Deck panjang terikat memberikan fungsi yang serupa dengan penapis ekor di Unix:

Pendekatan lain untuk menggunakan deques adalah untuk mengekalkan urutan elemen yang baru ditambahkan dengan melampirkan ke kanan dan muncul ke kiri:

Penjadual round-robin dapat dilaksanakan dengan iterator input yang disimpan dalam: class: `deque`. Nilai dihasilkan dari iterator aktif pada kedudukan sifar. Sekiranya iterator habis, ia boleh dikeluarkan dengan: meth: `

deque.popleft` jika tidak, ia boleh dikitar semula hingga akhir dengan: met: `

kaedah deque.rotate` menyediakan cara untuk melaksanakan: kelas: pemotongan dan penghapusan `deque`. Sebagai contoh, pelaksanaan Python murni del d [n] bergantung pada kaedah putar () untuk meletakkan elemen yang akan muncul:

Untuk melaksanakan: class: `deque` slicing, gunakan pendekatan serupa yang berlaku: meth:`

deque.rotate` untuk membawa elemen sasaran ke sebelah kiri deque. Keluarkan entri lama dengan: meth: `

deque.extend`, dan kemudian membalikkan putaran. Dengan variasi kecil pada pendekatan itu, mudah untuk menerapkan manipulasi tumpukan gaya Forth seperti dup, drop, swap, over, pick, rot, and roll.

defaultdict.default_factory`, mudah untuk mengelompokkan urutan pasangan nilai-kunci ke dalam kamus senarai:

Ketika setiap kunci ditemui untuk pertama kalinya, itu belum ada dalam pemetaan sehingga entri dibuat secara automatik menggunakan: attr: `

fungsi defaultdict.default_factory` yang mengembalikan kosong: class: `list`. Operasi: meth: `list.append` kemudian melampirkan nilai ke senarai baru. Apabila kunci ditemui sekali lagi, pencarian akan berjalan seperti biasa (mengembalikan senarai untuk kunci itu) dan operasi: meth: `list.append` menambah nilai lain ke dalam senarai. Teknik ini lebih mudah dan pantas daripada teknik yang setara menggunakan: met: `dict.setdefault`:

defaultdict.default_factory` to: class: `int` menjadikan: class:` defaultdict` berguna untuk mengira (seperti beg atau multiset dalam bahasa lain):

Ketika huruf pertama kali ditemui, surat itu hilang dari pemetaan, jadi: attr: `

defaultdict.default_factory` fungsi panggilan: func: `int` untuk membekalkan jumlah lalai sifar. Operasi kenaikan kemudian membina kiraan untuk setiap huruf.

Fungsi: func: `int` yang selalu mengembalikan sifar hanyalah kes khas fungsi tetap. Cara yang lebih pantas dan fleksibel untuk membuat fungsi tetap adalah dengan menggunakan fungsi lambda yang dapat memberikan nilai tetap (bukan hanya sifar):

: func: `bernamatuple` Fungsi Kilang untuk Tuples dengan Medan Dinamakan

Tuple yang diberi nama memberikan makna bagi setiap kedudukan dalam tuple dan membolehkan kod yang lebih mudah dibaca dan didokumentasikan sendiri. Mereka dapat digunakan di mana saja tupel biasa digunakan, dan mereka menambahkan kemampuan untuk mengakses bidang dengan nama dan bukannya indeks kedudukan.

Tuple yang diberi nama sangat berguna untuk memberikan nama bidang kepada tupel hasil yang dikembalikan oleh modul: mod: `csv` atau: mod:` sqlite3`:

Sebagai tambahan kepada kaedah yang diwarisi dari tupel, tupel bernama menyokong tiga kaedah tambahan dan dua atribut. Untuk mengelakkan konflik dengan nama bidang, nama kaedah dan atribut bermula dengan garis bawah.

Untuk mendapatkan medan yang namanya disimpan dalam rentetan, gunakan fungsi: func: `getattr`:

Untuk menukar kamus ke tuple bernama, gunakan operator ** (seperti yang dijelaskan dalam: ref: `tut-unpacking-argument`):

Oleh kerana tuple yang dinamakan adalah kelas Python biasa, mudah untuk menambah atau menukar fungsi dengan subkelas. Berikut adalah cara menambahkan medan yang dikira dan format cetakan lebar tetap:

Subkelas yang ditunjukkan di atas menetapkan __slots__ kepada tupel kosong. Ini membantu menjaga keperluan memori rendah dengan menghalang pembuatan kamus contoh.

Subkelas tidak berguna untuk menambah medan baru yang disimpan. Sebaliknya, cukup buat jenis tuple bernama baru dari: attr: `

Dokstring boleh disesuaikan dengan membuat tugasan langsung ke medan __doc__:

Nilai lalai dapat dilaksanakan dengan menggunakan: met: `

somenamedtuple._replace` untuk menyesuaikan contoh prototaip:

Kamus tertib sama seperti kamus biasa tetapi mempunyai beberapa keupayaan tambahan yang berkaitan dengan operasi pesanan. Mereka menjadi kurang penting sekarang bahawa kelas: kelas: diktib memperoleh keupayaan untuk mengingati pesanan sisipan (tingkah laku baru ini dijamin dalam Python 3.7).

Beberapa perbezaan dari: class: `ict` masih ada:

  • The regular: class: `ict` dirancang untuk menjadi sangat baik dalam operasi pemetaan. Urutan penyisipan penjejakan adalah sekunder.
  • The: class: `OrderedDict` dirancang untuk pandai mengatur semula operasi. Kecekapan ruang, kelajuan iterasi, dan prestasi operasi kemas kini adalah sekunder.
  • Secara algoritmik,: class: `OrderedDict` dapat menangani operasi penataan semula yang kerap lebih baik daripada: class: `ict`. Ini menjadikannya sesuai untuk mengesan akses baru-baru ini (misalnya dalam cache LRU).
  • Operasi persamaan untuk: class: `OrderedDict` memeriksa pesanan yang sepadan.
  • Kaedah: met: `popitem` dari: class:` OrderedDict` mempunyai tandatangan yang berbeza. Ia menerima argumen pilihan untuk menentukan item mana yang muncul. mempunyai kaedah: met: `move_to_end` untuk memposisikan semula elemen ke titik akhir dengan cekap.
  • Sehingga Python 3.8,: class: `ict` kekurangan kaedah: meth: `__reversed__`.

Kembalikan contoh subkelas: class: `ict` yang mempunyai kaedah khusus untuk menyusun semula susunan kamus.

Sebagai tambahan kepada kaedah pemetaan biasa, kamus yang dipesan juga menyokong iterasi terbalik menggunakan: func: `reversed`.

Ujian kesamaan antara: kelas: Objek `OrderedDict` peka terhadap pesanan dan dilaksanakan sebagai senarai (od1.items ()) == list (od2.items ()). Ujian persamaan antara: class: `OrderedDict` objek dan lain-lain: class:`

objek koleksi.abc.Mapping` tidak sensitif tertib seperti kamus biasa. Ini membolehkan: class: Objek `OrderedDict` diganti di mana sahaja kamus biasa digunakan.

Sangat mudah untuk membuat varian kamus teratur yang mengingati pesanan kuncinya terakhir dimasukkan. Sekiranya entri baru menimpa entri yang ada, kedudukan penyisipan asal diubah dan dipindahkan ke akhir:

An: class: `OrderedDict` juga berguna untuk melaksanakan varian: func:` functools.lru_cache`:

The class,: class: `UserDict` bertindak sebagai pembungkus objek kamus. Keperluan untuk kelas ini sebahagiannya digantikan oleh kemampuan untuk subkelas langsung dari: class: `ict` namun, kelas ini dapat lebih mudah digunakan kerana kamus yang mendasari dapat diakses sebagai atribut.

Kelas yang mensimulasikan kamus. Kandungan instance disimpan dalam kamus biasa, yang dapat diakses melalui atribut: attr: `data` dari: class:` UserDict`. Sekiranya data awal disediakan,: attr: `data` diinisialisasi dengan isinya menyatakan bahawa rujukan ke data awal tidak akan disimpan, membiarkannya digunakan untuk tujuan lain.

Selain menyokong kaedah dan operasi pemetaan,: class: Instance `UserDict` memberikan atribut berikut:

Kelas ini bertindak sebagai pembungkus objek senarai. Ini adalah kelas asas yang berguna untuk kelas seperti senarai anda sendiri yang boleh mewarisi dari mereka dan menggantikan kaedah yang ada atau menambah yang baru. Dengan cara ini, seseorang dapat menambahkan tingkah laku baru ke dalam senarai.

Keperluan untuk kelas ini telah diganti sebahagiannya oleh kemampuan untuk subkelas langsung dari: class: `list` namun, kelas ini dapat lebih mudah digunakan kerana senarai yang mendasari dapat diakses sebagai atribut.

Kelas yang mensimulasikan senarai. Kandungan instance disimpan dalam senarai biasa, yang dapat diakses melalui atribut: attr: `data` dari: class:` UserList`. Isi kandungan pada mulanya ditetapkan ke salinan senarai, ingkar senarai kosong []. senarai boleh diulang, contohnya senarai Python sebenar atau objek: class: `UserList`.

Selain menyokong kaedah dan operasi urutan yang dapat diubah,: kelas: Contoh `UserList` memberikan atribut berikut:

Keperluan subkelas: Subkelas dari: class: `UserList` diharapkan dapat menawarkan konstruktor yang boleh dipanggil tanpa argumen atau satu argumen. Senaraikan operasi yang mengembalikan urutan baru untuk membuat contoh kelas pelaksanaan sebenar. To do so, it assumes that the constructor can be called with a single parameter, which is a sequence object used as a data source.

If a derived class does not wish to comply with this requirement, all of the special methods supported by this class will need to be overridden please consult the sources for information about the methods which need to be provided in that case.

The class, :class:`UserString` acts as a wrapper around string objects. The need for this class has been partially supplanted by the ability to subclass directly from :class:`str` however, this class can be easier to work with because the underlying string is accessible as an attribute.

Class that simulates a string object. The instance's content is kept in a regular string object, which is accessible via the :attr:`data` attribute of :class:`UserString` instances. The instance's contents are initially set to a copy of seq. The seq argument can be any object which can be converted into a string using the built-in :func:`str` function.

In addition to supporting the methods and operations of strings, :class:`UserString` instances provide the following attribute:


3.7: Counting Multisets

A solution by BSI Problems Group, Bomm, Germanny, appeared in Monthly 117, October 2010, pp.747-748 without references to either P. Erdös, R. Honsberger, or S. Savchev.

We recursively construct multisets Am dan Bm of size 2 m for For such m, choose arbitrary positive cm. Let and For let and Inductively, and Also which yields

Claim 1 : a2 + a3 &isin <>3,. sn(n-1)/2>. Sejak a1 + a2 &le a1 + a3 &le a2 + a3, we have Also, the only sums that can be strictly smaller than are Thus

Claim 2 : Let B = <>1,. bn> with b1 &le b2 &le . &le bn. If and then We prove that by induction on i. Let and If then and are both minimal among S(A) - S(A(i - 1)). Oleh itu

Claim 3 : Let B = <>1,. bn> with b1 &le . &le bn. If and then Since the two smallest sums from the two sets are equal, and With the hypothesis we have Claim 2 now applies.

Given these claims, let A 1 , . A n-1 be multisets of size n having the same sumset. Write A k = <>1 (k) , . an (k) > with a1 (k) &le . &le an (k) . By Claim 1, there are at most n - 2 values for the sum of the second and third smallest elements. By the pigeonhole principle, there exist distinct k and m such that By Claim 3, Thus at most n - 2 multisets can have the same sumset.

Jawapannya adalah ya. Let A = <0, 4, 4, 4, 6, 6, 6, 10>, B = <2, 2, 2, 4, 6, 8, 8, 8, >, and C = <1, 3, 3, 3, 7, 7, 7, 9>. With exponents denoting multiplicity, S(A), S(B), and S(C) all equal <4 (3) , 6 (3) , 8 (3) , 10 (10) , 12 (3) , 14 (3) , 16 (3) >.

Note : The GCHQ Problem Solving Group solved part (a) by letting A1 be the set of nonnegative integers less than 2n whose binary expansion has an even number of ones and setting A2 = <0, 1, 2, . 2n - 1>- A1. This results from the construction given above by setting

For part (c), Daniele Degiorgi gave the example A = <0, 6, 7, 9, 11, 13, 14, 20>, B = <1, 5, 6, 8, 12, 14, 15, 19>, and C = <2, 4, 5, 9, 11, 15, 16, 18>, showing that it can be solved with sets (i.e., multisets with no repeated elements).

It remains open whether there are quadruples of multisets of size greater than 2 with the same sumset, or whether there are triples of multisets of any size greater than 2 other than 8 with the same sumset. Richard Stong showed that the search for such triples can be restricted to multisets whose size is an odd power of 2.


Tonton videonya: Matematik Tahun 1 membilang 1-10 (Ogos 2022).