首页 > 其他分享 >Swift 实现分数排名查询

Swift 实现分数排名查询

时间:2025-01-04 17:30:38浏览次数:3  
标签:分数 复杂度 Score Rank 查询 score sqlite3 Swift

在这里插入图片描述
在这里插入图片描述

文章目录

摘要

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

描述

SQL Schema / Pandas Schema

表: Scores

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

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

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

score 降序返回结果表。

查询结果格式如下所示。

示例 1:

输入: 
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() 来实现分数排名:

SELECT 
    score,
    DENSE_RANK() OVER (ORDER BY score DESC) AS rank
FROM Scores;

说明:

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

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:

数据库内容:

Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+

运行结果:

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:

数据库内容:

Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1  | 2.00  |
| 2  | 1.50  |
| 3  | 1.50  |
+----+-------+

运行结果:

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 的代码实现则提供了一个灵活高效的方式连接数据库并处理查询结果。本解决方案适用于类似的排名需求,例如考试成绩排名或产品评分排名等场景。

标签:分数,复杂度,Score,Rank,查询,score,sqlite3,Swift
From: https://blog.csdn.net/qq_36478920/article/details/144932642

相关文章

  • 2025-01-04:不包含相邻元素的子序列的最大和。用go语言,给定一个整数数组 nums 和一个由
    2025-01-04:不包含相邻元素的子序列的最大和。用go语言,给定一个整数数组nums和一个由二维数组queries组成的查询列表,其中每个查询的格式为queries[i]=[posi,xi]。对于每个查询i,首先将nums[posi]的值更新为xi,然后计算在这一更新后,数组nums中所有不包含相邻元素的子序......
  • posggres 的聚合查询,记录数好奇怪:
    我的测试环境如何产生数据的:用sysbench生成和测试过!sysbench--db-driver=pgsql--pgsql-host=127.0.0.1--pgsql-port=5432--pgsql-user=test02--pgsql-password=test02--pgsql-db=postgres--oltp-table-size=200000--oltp-tables-count=10--rand-init=on--threads=10......
  • BUGAWAY算法小抄-差分数组
    BUGAWAY算法小抄-差分数组什么是差分数组?差分数组的思想是通过对原始数组进行处理,得到一个新的数组(差分数组),利用该数组来高效地进行区间更新操作。具体来说,差分数组记录的是相邻元素之间的差值,而不是原始数组的元素本身。差分数组的原理1.差分数组的构造:假设有一个数组A=......
  • 使用Docker部署简单实用的 IP查询工具箱 【复制成功,复制和转载请标注本文地址】
    通过这个工具,可以查看需要查询的公网IP地址、连通性、检查WebRTC连接、检查DNS、网速测试、MTR测试等。假如你不想部署到本地,也可以直接体验官方网址:https://ipcheck.ing下面就开始部署:只需要一行命令就可以一键安装到docker,端口自行修改。部署起来非常的简单,使用SSH终端......
  • pat乙级1103 缘分数
    所谓缘分数是指这样一对正整数a和b,其中a和它的小弟a−1的立方差正好是另一个整数c的平方,而c正好是b和它的小弟b−1的平方和。例如83−73=169=132,而13=32+22,于是8和3就是一对缘分数。给定a所在的区间[m,n],是否存在缘分数?输入格式:输入给出区间的两个......
  • Go实战全家桶之三十二:指标系统查询加缓存
    测试用例func(self*TestGeneralserviceTestSuite)Test066_CacheQueryFrontSumReportShopl(){varreq=frontdto.NewStatRequest()req.ObjectType=esentity.OBJECT_TYPE_SHOPreq.ShopIds=[]int64{814560415908069377}varret=reportsum.Find......
  • 【MySQL】复合查询
    复合查询一、表的笛卡尔积1、介绍2、示例二、自连接1、介绍2、语法三、子查询1、介绍2、类型3、语法4、多行子查询运算符5、示例四、UNION和UNIONALL1、介绍2、注意3、语法4、示例五、表的连接查询1、介绍2、类型3、语法4、注意5、示例一、表的笛卡尔积1、介绍......
  • 如何快速查询脱硫煤电价
    随着信息化的发展,查询脱硫煤电价已变得相对便捷。脱硫煤是指经过脱除硫化物的煤炭,其燃烧产生的二氧化硫排放低于普通煤炭,因此脱硫煤电价的查询对于能源消费和环保方面都具有重要意义。在众多查询方式中,“光伏一点通”小程序是一个值得推荐的工具。脱硫煤电价的查询需求通常来......
  • 【Access语法】SQL连接查询
    在MicrosoftAccess中,联合查询(也称为JOIN查询)是用于从两个或多个相关表中检索数据的一种方法。通过使用联合查询,您可以将来自不同表的数据组合在一起,以便在一个结果集中进行查看和分析。联合查询的类型Access支持几种不同类型的联合查询,包括:内连接(InnerJoin):返回两个表中......
  • 【Access语法】SQL嵌套查询
    SQL子查询(Subquery)是在一个查询语句中嵌套另一个查询语句的功能。子查询可以出现在SELECT、FROM、WHERE或HAVING等子句中,用于返回单个值、一行值或一列值,以供外部查询使用。多层嵌套查询(也称为多级嵌套查询或深度嵌套查询)是指在一个查询语句中嵌套了多个子查询的情况。这种查询结......