84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
变量a = 8 以及已按大小顺序排列好的数组 b = array(1,3,5,7,8.9,9,11.3);
假设数组长度未知,变量值未知,数组键值按从小到大已排列好如何快速找到数量a的大小处于,数组b中那个键名与键名之间
eg: a=8,处于b[4]与b[5]之间
走同样的路,发现不同的人生
长度未知…………不太可能吧……不就是b.length就完了吗…………这种查询除了二分还有什么更好的方法吗……
或者自己封装一个class,在数组建立的时候做一个映射,把数据按照大小分组,怎么分组看你的要求,可以大幅提高速度。比如简单一点,按照整数分组,像这样:
class ClassA extends Array { constructor(...args) { super(...args); this.hash = []; for(let i = 0; i < this.length; i++) { if(!this.hash[Math.floor(this[i])]) this.hash[Math.floor(this[i])] = i; } } }
数组还是那个数组不变,只是添加一个hash,里面代表的是整数段的起始下标,比如你要查询8.5这个数,那么只需要查询this.hash[Math.floor(8.5)]和this.hash[Math.floor(8.5) + 1],两个下标之间的数据就行了,假如这俩hash里面是空的,那么分别往前、往后找就行,直到找到值为止。要是数据过于稀疏,那么可以给这个hash再做一个hash,记录有效整数段,反正就是空间换时间啦。
this.hash[Math.floor(8.5)]
this.hash[Math.floor(8.5) + 1]
明显使用二分查找
实现方法:
1、先排序(冒泡、快速排序等,本题已优先排列好) 2、插入需要判断的元素,再排序 3、返回插入数组所在的键值
长度未知…………不太可能吧……不就是b.length就完了吗…………
这种查询除了二分还有什么更好的方法吗……
或者自己封装一个class,在数组建立的时候做一个映射,把数据按照大小分组,怎么分组看你的要求,可以大幅提高速度。
比如简单一点,按照整数分组,像这样:
数组还是那个数组不变,只是添加一个hash,里面代表的是整数段的起始下标,比如你要查询8.5这个数,那么只需要查询
this.hash[Math.floor(8.5)]
和this.hash[Math.floor(8.5) + 1]
,两个下标之间的数据就行了,假如这俩hash里面是空的,那么分别往前、往后找就行,直到找到值为止。要是数据过于稀疏,那么可以给这个hash再做一个hash,记录有效整数段,反正就是空间换时间啦。明显使用二分查找
实现方法: