茶与健康
2018-12-10

茶与健康

这学期有幸选中全校最热门的公选课——茶与健康。之前每学期都是1000+人选28人,在周一晚上上课,从上学期开始每周多开一次下午的课(这个时间选择人数较少),正好我这学期周一下午没课,就来碰碰运气,没想到真的抽中了。这门课之所以这么火,主要是因为上课就是喝喝茶,发表自己的感想,听老师讲述茶文化,期末交一篇论文就可以了,虽然可能被卡优秀率,但只有1学分,花点GPA喝喝茶还是很值得的。

汇编上机题4
2018-12-03

题目

编程计算任一整数加减运算表达式,其中,表达式长度不超过1024个字节,从键盘输入,可带括号,操作数为字数据

算法基础上机实验四 最佳调度问题
2018-12-02

题目

最佳调度问题

问题描述

设有n个任务由k个可并行工作的机器来完成,完成任务i需要时间为ti。试设计一个算法找出完成这n个任务的最佳调度,使完成全部任务的时间最早。(要求给出调度方案)

完成全部任务的时间为运行时间最长的机器上运行的总时间,所有机器都是相同的。一个任务只能在一个机器上完成,且在完成之前不会被其他任务抢占。

汇编上机题3
2018-11-26

题目

计算N!(0<N<20)

代码

.MODEL SMALL    

.DATA
    D_N DW 4 DUP(0) ;N   (64bit)
    D_N_FAC DW 4 DUP(0) ;N!    (64bit)
    D_TMP DW 4 DUP(0) 
    D_I DW 4 DUP(0) 
    MAP DB "0123456789ABCDEF" 
    Q_TMP DW 0   
    R_TMP DW 0
.CODE
<!-- more -->


PRINTNEWLINE MACRO _PSTRING ;打印换行符
    PUSH AX
    PUSH DX
    MOV AH,2
    MOV DL,0DH
    INT 21H 
    MOV DL,0AH
    INT 21H
    POP DX
    POP AX
ENDM




PRINTNHEX PROC          ;打印一个64位整数(16进制)
    PUSHA         
    ;---------------- 
    MOV BX,7
    MOV CX,8
PLOOP:
    MOV AL,BYTE PTR D_N_FAC[BX] 
    MOV AH,0
    ;CMP AX,0
    ;JZ PEND:
    MOV DL,10H 
    DIV DL  ;商在AL,余数在AH
    MOV BYTE PTR Q_TMP,AL
    MOV BYTE PTR R_TMP,AH 
    MOV DI,Q_TMP   
    MOV DL,BYTE PTR MAP[DI] 
    MOV AH,2H
    INT 21H  
    MOV DI,R_TMP
    MOV DL,BYTE PTR MAP[DI]
    MOV AH,2H
    INT 21H 
    ;PEND:
    DEC BX             
    LOOP PLOOP       
    ;----------------
    POPA
    RET
ENDP

MOV8 MACRO DATAA,DATAB
    PUSH AX
    MOV AX,DATAB[0]
    MOV DATAA[0],AX
    MOV AX,DATAB[2]
    MOV DATAA[2],AX
    MOV AX,DATAB[4]
    MOV DATAA[4],AX
    MOV AX,DATAB[6]
    MOV DATAA[6],AX 
    POP AX
ENDM

BIGMUL MACRO RES,A,B  
    PUSHA
    ;----------------
    MOV WORD PTR RES[0],0
    MOV WORD PTR RES[2],0
    MOV WORD PTR RES[4],0
    MOV WORD PTR RES[6],0
    MOV CX,4
    MOV BX,0
    LOOP1:
    MOV DI,0
    PUSH CX
    ;------------
        LOOP2:
        MOV AX,B[BX]
        MUL A[DI] ;DX:AX=A[DI]*B[BX]
        MOV SI,BX
        ADD SI,DI ;SI=BX+DI 
        ADD WORD PTR RES[SI],AX
        PUSHF
        CMP SI,6
        JZ AEND
        POPF
        ADC WORD PTR RES[SI+2],DX
        PUSHF  
        CMP SI,4
        JZ AEND
        POPF
        ADC WORD PTR RES[SI+4],0
        PUSHF 
        CMP SI,2
        JZ AEND
        POPF
        ADC WORD PTR RES[SI+6],0  
        JMP AEND2
        AEND:
        POPF
        AEND2:
        ADD DI,2
        LOOP LOOP2  
    ;------------
    POP CX
    ADD BX,2
    LOOP LOOP1
    ;----------------
    POPA 
ENDM 
   

.STARTUP

    MOV WORD PTR D_N[0],19
    MOV CX,WORD PTR D_N[0] ;循环次数
    MOV D_I[0],1 ;当前i
    MOV D_TMP[0],1 ;临时结果
CALC:
    BIGMUL D_N_FAC,D_TMP,D_I
    MOV8 D_TMP,D_N_FAC  
    CALL PRINTNHEX 
    PRINTNEWLINE
    INC D_I[0]  ;I++
    LOOP CALC 

      
.EXIT 

END
算法基础上机实验三 最长公共子序列问题
2018-11-25

题目

最长公共子序列问题和调研报告

算法设计

1. 最长公共子序列问题(Longest common subsequence problem)的定义

子序列:给定序列X=(x1,x2,…,xm),序列Z=( z1,z2,…,zk)是X的一个子序列,必须满足:若X的索引中存在一个严格增的序列i1,i2,…,ik,使得对所有的j=1~k,均有xij=zj

公共子序列(CS):Z是X和Y的子序列,则Z是两者的公共子序列CS。

最长公共子序列(LCS):在X和Y的CS中,长度最大者为一个最长公共子序列

2. 用动态规划求解LCS

(1)刻画LCS最优解的结构特征

汇编上机题2
2018-11-19

题目

编程实现排序算法,对某文件(txt格式)中的无符号整数进行排序,排序结果输出到屏幕(数据的个数不超过1024)

代码

.MODEL SMALL,STDCALL
<!-- more -->


.DATA
    N DW 0
    TMP DW 1 DUP (0)
    NUMS DW 1024 DUP (0)   
    MSG_ERR DB 0dh,0ah,'THERE ARE SOME ERRORS IN OPERATING THE FILE!','$'  
    MSG_SUCCESS db 0dh,0ah,'SORT RESULT:','$'
    FILEHANDLE DW 0
    FILENAME DB "test2.txt"
    TMPC DB 1 DUP (0)
.CODE   

PRINTC MACRO CHAR;打印字符
    PUSH AX
    PUSH DX 
    MOV AH,2
    MOV DL,CHAR
    INT 21H
    POP DX
    POP AX     
ENDM 

PRINTS MACRO PSTRING ;打印字符串
    PUSH AX
    PUSH DX
    MOV AH,9H
    LEA DX,PSTRING
    INT 21H
    POP DX
    POP AX
ENDM

PRINTN PROC    ;打印一个16位整数,AX
    ;PUSH AX
    PUSH BX
    PUSH CX
    PUSH DX
    ;----------------
    MOV BX,10
    MOV CX,0
DPUSH:
    MOV DX,0
    DIV BX   ;DX:AX/10,即AX/10 商在AX,余数在DX
    PUSH DX ;余数即最低位,压栈
    INC CX  ;统计位数  
    CMP AX,0
    JZ DPOP  ;商为0,已经是最高位,开始出栈   
    JMP DPUSH    
DPOP:
    POP DX
    ADD DL,30H
    MOV AH,2H            
    INT 21H  ;打印栈顶的位        
    LOOP DPOP
    ;----------------
    POP DX
    POP CX
    POP BX
    ;POP AX
    RET
PRINTN ENDP

FGETN PROC ;从文件读取一个16位整数,结果在AX  
    PUSH BX
    PUSH CX
    PUSH DX    
  
    MOV CX,5 ;数的文本长度,最长5位
    MOV AX,0 ;乘法用的AX,初始化
LOOP1:
    ;-------------------READCHAR
    PUSH AX
    PUSH BX
    PUSH CX
    PUSH DX
    MOV AH,3FH
    MOV BX,FILEHANDLE
    MOV CX,1  ;读取长度
    LEA DX,TMPC;用于暂存读取的串
    INT 21H   ;读取后AX存放实际读取出的字符数
    JC R_ERR ;CF=1 出错
    CMP AX,0
    JZ R_QUIT ;AX=0, EOF
    CMP TMPC[0],20H
    JZ R_QUIT ;空格
    POP DX
    POP CX
    POP BX
    POP AX
    ;-------------------
    MOV DX,10 ;DX=10
    MUL DX    ;DX:AX=AX*10 由于读取的是16位无符号整数,最后只会在AX中,DX一直是10 
    SUB TMPC[0],30H ;
    ADD AX,WORD PTR TMPC[0] 
    LOOP LOOP1 
R_QUIT:
    POP DX
    POP CX
    POP BX
    POP AX    
    ;此时AX为读取的数
    JMP R_END
    
R_ERR:
    POP DX
    POP CX
    POP BX
    POP AX
R_END:
    POP DX
    POP CX
    POP BX
    RET
FGETN ENDP

SORT PROC ;冒泡排序
    PUSH AX
    PUSH BX
    PUSH CX
    PUSH DX    
    
    MOV CX,N 
    DEC CX    ;外循环次数为N-1
    SLOOP1:
    PUSH CX  ;把外循环计数器存下来
    ;-------------------
        MOV BX,0
        SLOOP2: ;外循环计数器也是内循环次数
        MOV AX,NUMS[BX]
        INC BX
        INC BX
        MOV DX,NUMS[BX]
        CMP AX,DX
        JZ NOEXCHANGE  ;AX=DX 
        JC NOEXCHANGE  ;AX<DX
        EXCHANGE:      ;AX>DX
            MOV NUMS[BX],AX
            DEC BX
            DEC BX
            MOV NUMS[BX],DX
            INC BX
            INC BX
        NOEXCHANGE:
        LOOP SLOOP2
    ;-------------------
    POP CX  ;取出外循环计数器
    LOOP SLOOP1
    
    POP DX
    POP CX
    POP BX
    POP AX
    RET
SORT ENDP

.STARTUP
    ;打开文件
    LEA DX,FILENAME ;MOV DX,OFFSET _FILENAME
    MOV AH,3DH 
    MOV AL,2    
    INT 21H
    JC ERROR ;出错
    ;---------
    MOV FILEHANDLE,AX   ;保存句柄
    CALL FGETN ;读取第一个数,表示接下来有几个数据
    MOV N,AX
    CALL PRINTN
    PRINTC 0DH
    PRINTC 0AH
    MOV BX,0
    MOV CX,N
FREAD:
    CALL FGETN
    MOV NUMS[BX],AX
    CALL PRINTN
    PRINTC 20H
    INC BX
    INC BX ;由于是字节,下标每次要加2
     LOOP FREAD
     
     ;---------
    CALL SORT
    ;---------
    
    PRINTS MSG_SUCCESS  
    PRINTC 0DH
    PRINTC 0AH
    
    MOV CX,N
    MOV BX,0
PRINTRESULT:
    MOV AX,NUMS[BX]
    CALL PRINTN
    PRINTC 20H
    INC BX
    INC BX
    
    LOOP PRINTRESULT

    JMP TOEND
    ;---------
ERROR:
    PRINTS MSG_ERR
    CALL PRINTN; 打印AX存储的错误码
TOEND:
    MOV    AH, 4CH ;按任意键结束 
    INT    21H

.EXIT 

END

算法基础上机实验二 红黑树维护算法及其区间树应用
2018-11-18

题目

红黑树维护算法及其区间树应用

算法设计

(一)红黑树

红黑树是一棵二叉搜索树,是众多平衡二叉树中的一种,它可以保证在最坏情况下基本操作的时间复杂度为O(lgn)

红黑树的每个结点包含5个属性:color、key、left、right、parent,分别表示颜色、关键字、左孩子、右孩子、父亲。

img

红黑树有以下性质:

① 每个节点必须为红色或黑色;

② 根为黑色;

③ 树中的nil叶子为黑;

④ 若节点为红,则其两个孩子必为黑;

⑤ 每节点到其后代叶子的所有路径含有同样多的黑节点;

红黑树的基本操作:

(1)左旋/右旋
搜索
背景设置