我正在寻找一种算法,也许是启发式算法来解决以下问题。
是否可以使用搜索功能枚举集合中的所有项目? 是否有任何已知的算法/启发式方法可以实现此目的?
例如按照以下条件:
- 有一个 API 允许按标题搜索歌曲。
- 不区分大小写。
- 搜索匹配歌名的任何部分,可以匹配歌名的开头部分和中间部分。
- 当搜索短语为空时,它返回前 100 个。
- 歌曲按 SongOrder 属性排序。
- 它只返回前 100 名。
- 很可能最多会有几千首歌曲 数据库。但实际歌曲数量消费者不得而知 下面的函数。
- 这是一个现实生活中的问题,搜索功能无法更改。
搜索功能的伪实现如下所示:
List<Song> FindSongs(string searchText)
{
var allSongs = LoadAllSongsFromDB();
var allSongsOrderedBySongOrder = allSongs.OrderBy(x => x.SongOrder);
var matchingSongs = allSongsInDatabase.Where(song => searchText == null || song.Title.Contains(searchText));
var topHundred = matchingSongs.Take(100);
return topHundred.AsList();
}
class Song
{
public int Id;
public string Title;
public int SongOrder;
}
最佳答案
首先搜索单个字母。例如,搜索“A”可能会返回 100 首歌曲,但搜索“Z”可能会返回不到 100 首歌曲。
然后对于返回 100 首歌曲的每个字母,添加另一个字母。例如,假设搜索“A”返回 100 首歌曲,则搜索“AA”、“AB”、“AC”等。
任何返回 100 首歌曲的搜索都需要通过添加另一个字母来优化。任何返回少于 100 首歌曲的搜索都已完成:这些歌曲可以在删除重复项后添加到输出列表中。
关于algorithm - 是否可以使用搜索功能枚举集合中的所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53861388/