Lelang penawaran umum perdana

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:
Penawar dengan harga tertinggi mendapatkan # saham yang mereka tawar
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:
- penawar dengan penawaran tertinggi mendapatkan semua saham yang mereka tawar, dan kemudian
- 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: bids
ada [[0,2,10,0], [1,2,10,0]]
dan totalShares
ada 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
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)