Python判断列表是否已排序的各种方法

本文基于Python2.7语言,给出判断列表是否已排序的多种方法,并在作者的windows XP主机(Pentium g630 2.7ghz主频2gb内存)上对比和分析其性能表现。

一. 问题提出

haskell培训老师提出一个问题:如何判断列表是否已经排序?

排序与否实际只是相邻元素间的某种二元关系,即a->a->bool。

所以第一步可以把二元组列表找出来;第二步是把这个函数作用于每个元组,然后用and操作。

老师给出的实现代码如下:

pair lst = zip lst ( tail lst )

sorted lst predict = and [ predict x y | (x,y) <- pair lst]

haskell中,等号前面是函数的名称和参数,后面是函数的定义体。

pair函数将列表lst错位一下(tail除去列表的第一个元素)后,和原列表在zip的作用下形成前后相邻元素二元组列表。

predict函数接受两个数字,根据大小返回true或False。

and对类型为[bool]的列表中所有元素求与,其语义类似Python的all()函数。

随后,老师请大家思考性能问题。

作者提出,若准确性要求不高,可生成三组随机数排序后作为下标,提取原列表相应的三组元素组成三个新的子列表("采样")。

若判断三个子列表遵循同样的排序规则时,则认为原列表已排序。

当列表很大且前段已排序时,选取适当数目的随机数,可在保障一定准确率的同时显著地降低运算规模。

此外,实际应用中还应考虑数据来源。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
< COLS; j++) { board[i][j].setBackground(BOARD_COLOR); boardStatus[i][j] = 0; 在Python中,可以使用sort()方法列表进行排序,也可以使用sorted()函数对列表进行排序。 sort()方法用于在原列表排序,使用方法如下: ```python my_list = [3, 1, 4, 1 } } currentPlayer = 1; if (player1Color == BLACK_COLOR) { turnLabel.setText("Black's, 5, 9, 2, 6] my_list.sort() print(my_list) # 输出 [1, 1 turn"); } else { turnLabel.setText("White's turn"); } if (gameMode == 0) { machineBtn.setEnabled(false); } else { machineBtn.setEnabled(true); if (machineFirst) { machinePlay(); } , 2, 3, 4, 5, 6, 9] ``` 如果需要对列表进行降序排序,可以传入`reverse=True`参数: ```python my_list = [3, 1, 4, 1, } } // 根据当前棋盘状态进行AI下棋 private void machinePlay() { int[] move5, 9, 2, 6] my_list.sort(reverse=True) print(my_list) # 输出 [9, 6 = AI.getMove(boardStatus, machineColor); boardStatus[move[0]][move[1]] = 2; board[, 5, 4, 3, 2, 1, 1] ``` sorted()函数返回一个新列表,move[0]][move[1]].setBackground(machineColor); if (checkWin(move[0], move[1])) { showMessage(W使用方法如下: ```python my_list = [3, 1, 4, 1, 5, 9,HITE_WIN_MSG); newGame(); } else if (checkFull()) { showMessage(DRAW_MSG); newGame(); 2, 6] new_list = sorted(my_list) print(new_list) # 输出 [1, 1, 2, } else { currentPlayer = 1; turnLabel.setText("Black's turn"); } } // 判断是否有一 3, 4, 5, 6, 9] ``` 同样,可以传入`reverse=True`参数对方获胜 private boolean checkWin(int row, int col) { int[][] deltas = {{0, 1}, {1, 0}, {1, 1}, {1, -1}}; for (int[] delta : deltas) { int seq列表进行降序排序: ```python my_list = [3, 1, 4, 1, 5, 9Len = 1; int r = row + delta[0], c = col + delta[1]; while (r >= 0 && r < ROWS && c >= 0 && c < COLS && boardStatus[r][c] == currentPlayer) { seqLen++; r += delta[0]; c += delta[1]; } r = row - delta[0]; c = col - delta[1]; while (r >= 0 && r < ROWS && c >= 0 && c < COLS && boardStatus[r][c] == currentPlayer) { seqLen++; r -= delta[0]; c -= delta[1]; } if (seqLen >= WIN_SEQ_LEN) { return true; } } return false; } // 判断棋盘是否已满 private boolean checkFull() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (boardStatus[i][j] == 0) { return false; } } } return true; } // 显示游戏结果 private void showMessage(String msg) { JOptionPane.showMessageDialog(this, msg, TITLE, JOptionPane.INFORMATION_MESSAGE); } public static void main(String[] args) { new Game(); } } ``` AI.java ```java import java.util.ArrayList; import java.util.List; public class AI { private static final int INF = 1000000; private static final int[][] deltas = {{0, 1}, {1, 0}, {1, 1}, {1, -1}}; // 获取AI的下一步走法 public static int[] getMove(int[][] boardStatus, int color) { int[] move = {-1, -1, -1}; int score = -INF; List<int[]> moves = generateMoves(boardStatus); for (int[] pos : moves) { int row = pos[0], col = pos[1]; int[][] newBoardStatus = copyBoard(boardStatus); newBoardStatus[row][col] = 2; int newScore = negamax(newBoardStatus, -INF, INF, 1, color); if (newScore > score) { score = newScore; move[0] = row; move[1] = col; move[2] = newScore; } } return move; } // 生成所有可行走法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值