主頁 > 軟體設計 > Python在競賽中的應用-測驗資料的構造與對拍 --演算法專題精解(31)

Python在競賽中的應用-測驗資料的構造與對拍 --演算法專題精解(31)

2020-12-19 10:26:31 軟體設計

本系列文章將于2021年整理出版,書名《演算法競賽專題決議》,
前驅教材:《演算法競賽入門到進階》 清華大學出版社
網購:京東 當當 ??? ?作者簽名書

如有建議,請加QQ 群:567554289,或聯系作者QQ:15512356

文章目錄

  • C.1 計算大數
  • C.2 構造亂數和隨機字串
  • C.3 陣列去重
  • C.4 構造測驗資料和對拍

??很多人認為Python是最受歡迎的編程語言,它編碼簡潔,有強大的庫,
??Python早已應用在演算法競賽中,能節省大量比賽時間,
??大學的某些演算法競賽(ICPC)已經支持用Python語言提交代碼,即使比賽不支持用Python提交代碼,而Linux系統一般是預裝Python的,可以用Python做輔助作業,
??Python的優點有編碼簡便、處理大數非常簡單、構造測驗資料比C++更簡單等,Python的主要問題是執行時間慢,比C++、java慢得多,競賽隊員可能不會直接用Python交題,不過,Python可以作為工具使用,常用的是構造資料、寫對拍代碼,一個典型的應用是:如果能用打表法交題,可以先用python打表出資料,然后用c++或直接用Python提交,
??讀者會發現,用Python做這些事,比用C++容易得多,這在緊張的比賽中是很有用的,
??若讀者想學習用Python寫演算法競賽題的代碼,建議到力扣網站(leetcode-cn.com)練習,每個題都有人提交Python題解,
??Python的強大,主要是因為它龐大的庫,Python有兩種版本Python 2、Python 3,兩者不兼容,本節基于 Python 3,Python編譯環境下載地址:https://www.python.org/downloads/
??下面介紹Python在演算法競賽中的應用,

C.1 計算大數

??下面的題目是計算大數,


階乘之和 洛谷 P1009https://www.luogu.com.cn/problem/P1009
題目描述:計算S=1!+2!+3!..+n! (n≤50)


??計算結果是一個天文數字,如果用C++編碼,需要用高精度,很復雜,而Java和python都能直接處理大數,
??用Java編碼很簡單:

import java.math.*;
import java.util.*;
public class Main {
	public static void main(String[] args) {
         Scanner in= new Scanner(System.in);
         int n = in.nextInt();                               
         BigInteger s = new BigInteger("1");
         BigInteger ans = new BigInteger("0");
         for (int i = 1; i <= n; i++) {
              s = s.multiply(new BigInteger(String.valueOf(i)));
              ans = ans.add(s);
         }
         System.out.println(ans);
    }
}

??用Python編碼更簡單:

n = int(input()) 
s = 1 
ans = 0
for i in range(1,n+1,1):    
    s *= i
    ans += s 
print(ans)

C.2 構造亂數和隨機字串

??用Python構造測驗資料,比c++簡單得多,它能直接產生極大的數字,方便地產生隨機字符等,下表列出了一些典型的亂數、隨機字串構造方法1

(1)匯入庫

import random  

??可以寫成:

from random import *

??此時后面的代碼能夠簡單一點,例如把random.randint直接寫為randint

(2)在指定范圍內生成一個很大的隨機整數:

print (random.randint(-9999999999999999,9999999999999999))  

??輸出示例:428893995939258

(3)在指定范圍內(0到100000)生成一個隨機偶數:

print (random.randrange(0, 100001, 2))   

??輸出示例:14908
(4)生成一個0到1之間的隨機浮點數:

print (random.random())   

??輸出示例:0.2856636141181378
(5)在指定范圍內(1到20)生成一個隨機浮點數:

print (random.uniform(1, 20))   

??輸出示例:9.81984258258233
(6)在指定字符中生成一個隨機字符:

print (random.choice('abcdefghijklmnopqrst@#$%^&*()')) 

??輸出示例:D
(7)在指定字符中生成指定數量的隨機字符:

print (random.sample('zyxwvutsrqponmlkjihgfedcba',5))  

??輸出示例:[‘z’, ‘u’, ‘x’, ‘w’, ‘j’]
(8)匯入庫

import string

??若寫成from string import *,下面的string.ascii_letters改為ascii_letters
(9)用a-z、A-Z、0-9生成指定數量的隨機字串:

ran_str = ''.join(random.sample(string.ascii_letters + string.digits, 8))
print (ran_str)

??輸出示例:iCTm6yxN
(10)從多個字符中選取指定數量的字符組成新字串:

print (''.join(random.sample(['m','l','k','j','i','h','g','d'], 5)))

??輸出示例:mjlhd
(11)打亂陣列的順序:

items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]   
random.shuffle(items)
for i in range(0,len(items),1):      #逐個列印
   print (items[i]," ",end='')

??輸出示例:1 0 8 3 5 7 9 4 6 2

C.3 陣列去重

??下面給出兩種方法:第1種方法用set(),速度很快,它的復雜度是O(1)的;第2種方法是暴力去重,非常慢,

def NonRepeatList1(data):   #函式1:set去重,不保持原順序
    return list(set(data))
def NonRepeatList2(data):   #函式2:暴力去重,保持原順序
    return [i for n, i in enumerate(data) if i not in data[:n]]
#下面測驗上面2個函式
import random
import time
time0=time.time()
a = []
for i in range(0,100000,1):                #10萬個亂數
    a.append(random.randint(0,20))
#print (a)                                #可以列印陣列看看
print ("random time=",time.time()-time0)  #列印時間

time0 = time.time()
b = NonRepeatList1(a)                     #去重,不保持原順序
#print (b)                                #列印看看是否亂序
print ("set time=",time.time()-time0)

time0 = time.time()
c = NonRepeatList2(a)                     #去重,保持原順序
#print (c)                                #列印看看是否保持原序
print ("enum time=",time.time()-time0)

??代碼中統計了兩種方法的執行時間,在作者的電腦上運行,輸出時間是:

random time= 0.0957651138305664
set time= 0.000997781753540039
enum time= 13.196359395980835

C.4 構造測驗資料和對拍

??仍然以Hdu 1425為例,


hdu 1425 sort http://acm.hdu.edu.cn/showproblem.php?pid=1425
給你n個整數,請按從大到小的順序輸出其中前m大的數,
輸入:每組測驗資料有兩行,第一行有兩個數n, m(0 < n, m < 1000000),第二行包含n個各不相同,且都處于區間[-500000, 500000]的整數,
輸出:對每組測驗資料按從大到小的順序輸出前m大的數,


??首先構造測驗資料,下面的代碼生成60多萬個不同的無序的亂數,首先產生100萬個亂數,然后用set去重,最后用shuffle打亂即可,

#設本代碼的檔案名是aa.py
import random
a= []
b= []
for i in range(0,1000000,1):      #100萬個亂數
    a.append(random.randint(-500000,500000))
b=list(set(a))               #去重

#print("lena=",len(a))      #驗證a的個數是不是100萬個
#print("lenb=",len(b))      #b的個數有60多萬個

random.shuffle(b)          #打亂b
print(len(b),random.randint(1,len(b)))   #列印n、m
for i in range(0,len(b),1):              #逐個列印
print ( b[i],end=' ')  

#下面的做法是存到一個檔案里面,其實不需要
''' 
f = open("d:\data.in", "w")    #輸出到檔案里
print(len(b),random.randint(1,len(b)),file=f)
for i in range(0,len(b),1):      #逐個列印
    print ( b[i],end=' ',file=f)    
f.close()
'''

??下面以Windows環境為例說明構造測驗資料和對拍的程序,linux環境類似,
??把上面的代碼存為檔案aa.py,執行下面的命令,輸出測驗資料到檔案data.in

D:\>C:\Users\hp\AppData\Local\Programs\Python\Python39\python aa.py >data.in

??作者的python安裝在目錄“C:\Users\hp\AppData\Local\Programs\Python\Python39\”,讀者可以按自己的目錄操作,或者設定環境變數,就不用輸這個目錄了,
??下面給出Hdu 1425的對拍代碼,功能是:先輸入n和m,然后輸入n個數,排序后,列印出前m大的數,與C++對拍代碼相比,Python代碼更簡單,

#設本代碼的檔案名是bb.py
n,m = map(int,input().split())  #輸入n、m
a=[int(n) for n in input().split()]  #輸入n個數
a.sort()  #排序
for i in range(n-1,n-m,-1):  #列印出前m-1大的數
    print ( a[i],end=' ')
print ( a[n-m])              #列印出第m大的數

??把代碼存為檔案bb.py,Windows環境下,執行以下命令,讀輸入資料data.in,輸出資料到py.out

D:\>C:\Users\hp\AppData\Local\Programs\Python\Python39\python bb.py <data.in >py.out

??前一節“測驗資料的構造與對拍https://blog.csdn.net/weixin_43914593/article/details/106863166”的hash代碼是:

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1000001;
int a[MAXN];
int main(){
    int n,m;
    while(~scanf("%d%d", &n, &m)){
        memset(a, 0, sizeof(a));
        for(int i=0; i<n; i++){
            int t;
            scanf("%d", &t); //此題資料多,如果用很慢的cin輸入,肯定TLE
            a[500000+t]=1;    //數字t,登記在500000+t這個位置
        }
        for(int i=MAXN; m>0; i--)
            if(a[i]){
                if(m>1)  printf("%d ", i-500000);
                else      printf("%d\n", i-500000);
                m--;
            }
    }
    return 0;
}

??設代碼的檔案名是hash,執行代碼,讀取輸入data.in,輸出到檔案hash.out

D:\>hash <data.in >hash.out

??下面比較2個代碼的輸出是否一樣,執行以下命令:

D:\>fc py.out hash.out /n

??Linux環境下是diff命令

[root]#diff -c hash.out py.out

  1. 參考https://www.cnblogs.com/zqifa/p/python-random-1.html ??

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/237120.html

標籤:其他

上一篇:Educational Codeforces Round 100 A—D題題解

下一篇:Spring 原始碼詳解(一)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more