前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Swift高效实现分数排名查询,提升性能的最佳方案!

Swift高效实现分数排名查询,提升性能的最佳方案!

原创
作者头像
Swift社区
发布2025-03-21 23:25:54
发布2025-03-21 23:25:54
200
举报
文章被收录于专栏:Swift社区Swift社区

摘要

本篇文章将讲解如何在数据库中为比赛分数表设计排名系统。通过 SQL 查询语句和 Swift 数据库接口的结合,我们能够根据特定规则为分数生成排名。文章包括问题描述、题解答案、代码分析、测试案例及结果分析,并附带复杂度分析。

描述

SQL Schema / Pandas Schema

表: Scores

代码语言:txt
复制
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| score       | decimal |
+-------------+---------+
id 是该表的主键(有不同值的列)。
该表的每一行都包含了一场比赛的分数。Score 是一个有两位小数点的浮点值。

编写一个解决方案来查询分数的排名。排名按以下规则计算:

  • 分数应按从高到低排列。
  • 如果两个分数相等,那么两个分数的排名应该相同。
  • 在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。

按 score 降序返回结果表。

查询结果格式如下所示。

示例 1:

代码语言:txt
复制
输入: 
Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+
输出: 
+-------+------+
| score | rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

SQL 解法

我们可以使用窗口函数 DENSE_RANK() 来实现分数排名:

代码语言:sql
复制
SELECT 
    score,
    DENSE_RANK() OVER (ORDER BY score DESC) AS rank
FROM Scores;

说明:

  1. DENSE_RANK() 是一种窗口函数,可根据排序规则为分数生成密集排名。
  2. ORDER BY score DESC 表示按照分数降序排列。

Swift 题解代码

以下是基于 Swift 的完整实现:

代码语言:swift
复制
import SQLite3

func getRankedScores(databasePath: String) -> [(score: Double, rank: Int)] {
    var db: OpaquePointer?
    var stmt: OpaquePointer?
    var results: [(score: Double, rank: Int)] = []

    // 打开数据库连接
    if sqlite3_open(databasePath, &db) == SQLITE_OK {
        let query = """
        SELECT 
            score,
            DENSE_RANK() OVER (ORDER BY score DESC) AS rank
        FROM Scores;
        """
        
        // 准备查询语句
        if sqlite3_prepare_v2(db, query, -1, &stmt, nil) == SQLITE_OK {
            // 执行查询并获取结果
            while sqlite3_step(stmt) == SQLITE_ROW {
                let score = sqlite3_column_double(stmt, 0)
                let rank = Int(sqlite3_column_int(stmt, 1))
                results.append((score, rank))
            }
        } else {
            print("SQL Error: \(String(cString: sqlite3_errmsg(db)))")
        }
        
        // 清理资源
        sqlite3_finalize(stmt)
    }
    sqlite3_close(db)

    return results
}

// 示例测试
let databasePath = "path_to_your_database.sqlite"
let rankedScores = getRankedScores(databasePath: databasePath)
for (score, rank) in rankedScores {
    print("Score: \(score), Rank: \(rank)")
}

Swift 题解代码分析

逻辑分析

  1. 数据库连接:
    • 使用 sqlite3_open 函数连接 SQLite 数据库。
    • 若连接失败,打印错误信息。
  2. SQL 查询:
    • 利用窗口函数 DENSE_RANK() 对分数生成密集排名。
    • 查询结果按分数降序排列。
  3. 结果处理:
    • 遍历查询结果,将每条记录的分数和排名存储到 Swift 数组中。
  4. 资源管理:
    • 使用 sqlite3_finalizesqlite3_close 清理资源,防止内存泄漏。

安全性

  • 使用参数化查询可防止 SQL 注入(尽管本例中无需参数)。

示例测试及结果

测试 1:

数据库内容:

代码语言:txt
复制
Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+

运行结果:

代码语言:txt
复制
Score: 4.0, Rank: 1
Score: 4.0, Rank: 1
Score: 3.85, Rank: 2
Score: 3.65, Rank: 3
Score: 3.65, Rank: 3
Score: 3.5, Rank: 4

测试 2:

数据库内容:

代码语言:txt
复制
Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1  | 2.00  |
| 2  | 1.50  |
| 3  | 1.50  |
+----+-------+

运行结果:

代码语言:txt
复制
Score: 2.0, Rank: 1
Score: 1.5, Rank: 2
Score: 1.5, Rank: 2

时间复杂度

  1. SQL 查询:
    • 排序的复杂度为 (O(n \log n)),其中 (n) 是 Scores 表的行数。
    • DENSE_RANK() 的复杂度为 (O(n))。

总时间复杂度: (O(n \log n))

空间复杂度

  1. SQL 查询:
    • 排序需要额外的 (O(n)) 内存。
  2. Swift 代码:
    • 存储查询结果的数组复杂度为 (O(n))。

总空间复杂度: (O(n))

总结

通过 DENSE_RANK() 函数,解决了排名系统的实现问题。Swift 的代码实现则提供了一个灵活高效的方式连接数据库并处理查询结果。本解决方案适用于类似的排名需求,例如考试成绩排名或产品评分排名等场景。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 摘要
  • 描述
  • SQL 解法
  • Swift 题解代码
  • Swift 题解代码分析
    • 逻辑分析
    • 安全性
  • 示例测试及结果
    • 测试 1:
    • 测试 2:
  • 时间复杂度
  • 空间复杂度
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档