有没有人给我任何提示或指导我应该使用什么算法在大型数据库(音乐或歌曲几乎 1000x10)中进行搜索查询功能,到目前为止我尝试过的是线性搜索(时间 O(n) 使用迭代进行过滤查询)这会消耗太多内存,而且在给定查询上搜索速度太慢,这是代码的一部分:-
关于活动 - >
SearchViewModel searchViewModel = new ViewModelProvider(this).get(SearchViewModel.class);
songAdapter = new SongAdapter(getApplicationContext(),new ArrayList<>());
layoutBinding.searchRecyclerviewForSongs.setAdapter(songAdapter);
layoutBinding.searchEdittextBox.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
// task.searchFilterData(editable.toString());
searchViewModel.getResultList(SearchHome.this, editable.toString())
.observe(SearchHome.this,
new Observer<List<SongsPOJO>>() {
@Override
public void onChanged(List<SongsPOJO> songsPOJOS) {
Log.i(TAG, "onChanged: searchViewModel->" + songsPOJOS.size());
// Update UI with the new data
songAdapter.clearSongData(songsPOJOS);
}
});
}
});
我使用 editText 作为带有 textWatcher 的查询可搜索框 -> afterTextChanged(可编辑可编辑) 在这里,我使用 viewmodel 并将搜索查询传递到后台并在 ui 上返回结果
ViewModel 代码->
public MutableLiveData<List<SongsPOJO>> getResultList(Context context,String _searchTxt) {
myapp = (App) context.getApplicationContext();
service = myapp.getExecutorService();
service.submit(new Runnable() {
@Override
public void run() {
List<SongsPOJO> filteredList = filteredData(context, _searchTxt);
setList.postValue(filteredList);
}
});
return setList;
}
private List<SongsPOJO> filteredData(Context context,String _query){
// Filter logic here:-
List<SongsPOJO> filterList = new ArrayList<>();
// Projection for the columns you want to retrieve
String[] projection = {
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
// Add other columns you need
};
// Selection criteria for the query
String selection = MediaStore.Audio.Media.TITLE + " LIKE ?";
String[] selectionArgs = new String[]{"%" + _query + "%"};
// Sorting order for the results
String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";
// Perform the query
ContentResolver contentResolver = context.getContentResolver();
Cursor cursor = contentResolver.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
selectionArgs,
sortOrder
);
// Check if the cursor is not null
if (cursor != null) {
try {
// Use the cursor to retrieve data
while (cursor.moveToNext()) {
String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
// Use a single list for both data loading and filtering
SongsPOJO songsPOJO = new SongsPOJO();
songsPOJO.setSongName(title);
filterList.add(songsPOJO);
}
} finally {
// Close the cursor when done
cursor.close();
}
}
return filterList;
}
如果我以错误的方式处理这个问题,也请告诉我。
我想要实现的是像其他离线音乐应用程序一样的搜索功能吗?当一个人输入任何歌曲名称时,相关的关键字歌曲就会立即出现在 recyclerview 或 UI 上,我的意思是太快了,或者至少引导我朝正确的方向解决上述问题?预先感谢!
对于快速搜索问题,
Binary Search
提出了Log(N)的时间复杂度。但请记住,它需要应用排序的数据。
这促使您选择排序算法。 选择排序算法取决于一些因素,例如:
认为看一下二分查找会有帮助。