Lelang penawaran umum perdana

Aug 16 2020

Transkripsi gambar:

Perusahaan mendaftar untuk IPO. Semua saham tersedia di situs web untuk penawaran selama jangka waktu yang disebut jendela penawaran. Di akhir jendela penawaran, logika lelang digunakan untuk memutuskan berapa banyak saham yang tersedia pergi ke penawar mana sampai semua saham telah dialokasikan, atau semua penawar telah menerima saham yang mereka tawar, mana yang lebih dulu.

Tawaran datang dari pengguna dalam bentuk [userid, # saham, harga penawaran, stempel waktu] hingga jendela penawaran ditutup.

Logika lelang menetapkan saham sebagai berikut:

  1. Penawar dengan harga tertinggi mendapatkan # saham yang mereka tawar

  2. Jika beberapa penawar memiliki tawaran pada harga yang sama, penawar diberi saham sesuai urutan mereka mengajukan tawaran (tawaran paling awal terlebih dahulu)

Buat daftar userid dari semua pengguna yang tidak mendapatkan bahkan 1 share setelah semua share dialokasikan.

Memasukkan


  • daftar tawaran daftar int yang mewakili [userid, # share, $ bid, timestamp]
  • totalShares
    total # saham yang akan dibagikan.

Melakukan

mendistribusikan saham di antara penawar dan kembali pengguna dari penawar yang mendapat 0 saham.

Bagikan logika distribusi:

  1. penawar dengan penawaran tertinggi mendapatkan semua saham yang mereka tawar, dan kemudian
  2. jika ada hubungan dalam $ bid price, berikan saham kepada penawar sebelumnya.

Saya merasa solusi yang saya dapatkan relatif sederhana. Tampaknya melewati semua kasus tepi yang dapat saya pikirkan.

Pertanyaan

Saya menemukan situasi yang meragukan:
Harga dan waktu penawaran sama dan tidak ada cukup saham untuk semua penawar yaitu: bidsada [[0,2,10,0], [1,2,10,0]]dan totalSharesada 2. Tidak jelas apakah 1 share harus diberikan kepada masing-masing, atau jika userid 0 hanya mendapatkan keduanya.

Kode

Bisakah solusi saya dioptimalkan?

def getUnallocatesUsers(bids, totalShares):
  s = 0
  for b in bids:
      s += b[1]  
  if totalShares >= s: return []  # no losers because enough shares to go around

  bids.sort(key = lambda x: (-x[2],x[3]))  # sort by highest bid, then timestamp for ties
  losers = []
  for b in bids:
    if totalShares <= 0: losers.append(b[0])
    else:
      totalShares -= b[1]
  return losers

Jawaban

2 RootTwo Aug 18 2020 at 09:39

Gunakan nama fungsi yang diberikan dalam soal:

def getUnallottedUsers(bids, totalShares):

Masalahnya tidak memberikan informasi apa pun tentang kemungkinan adanya cukup saham untuk semua bidder, jadi IMO for-loop pertama adalah contoh pengoptimalan prematur.

Gunakan konstanta, bukan "angka ajaib". Gunakan nama yang bermakna. Lihat PEP8 tentang konvensi pemformatan umum. Hal-hal ini sangat membantu dalam membuat kode dapat dibaca.

USERID = 0
SHARES = 1
PRICE = 2
TIME = 3

bids.sort(key=lambda bid:(-bid[PRICE], bid[TIME]))

for index, bid in enumerate(bids):
    totalShares -= bid[SHARES]

    if totalShares <= 0:
        break

Jawab pertanyaan yang diajukan: "Fungsi harus mengembalikan daftar bilangan bulat, masing-masing merupakan id untuk penawar yang tidak menerima saham, diurutkan naik "

return sorted(bid[USERID] for bid in bids[index + 1:])

Bersama:

USERID = 0
SHARES = 1
PRICE = 2
TIME = 3

def getUnallottedUsers(bids, totalShares):
    bids.sort(key=lambda bid:(-bid[PRICE], bid[TIME]))

    for index, bid in enumerate(bids):
        totalShares -= bid[SHARES]

        if totalShares <= 0:
            break

    return sorted(bid[USERID] for bid in bids[index + 1:])

Atau gunakan iterator:

    bids = iter(bids)
    while totalShares > 0:
        price = next(bid)[PRICE]
        totalShares -= price

    return sorted(bid[USERID] for bid in bids)