网花。急用2万。

JAVA(61)
如何检查一个未排序的数组中是否包含某个特定值,这是一个在Java中非常实用并且频繁使用的操作。另外,这也是Stack Overflow上面非常受关注的问题。在得票数最多的答案中,可以看到,检查数组中是否包含特定值可以用多种不同的方式实现,但是时间复杂度差别很大。下面,我将为大家展示各种方法及其需要花费的时间。
1.检查数组中是否包含特定值的四种不同方法
1)使用List:
useList(String[] arr, String targetValue) {
&&&&return
Arrays.asList(arr).contains(targetValue);
2)使用Set:
useSet(String[] arr, String targetValue) {
&&&&Set&String&
HashSet&String&(Arrays.asList(arr));
&&&&return
set.contains(targetValue);
3)使用一个简单循环:
useLoop(String[] arr, String targetValue) {
&&&&for(String
&&&&&&&&if(s.equals(targetValue))
&&&&&&&&&&&&return
&&&&return
4)使用Arrays.binarySearch():
注:下面的代码是错误的,这样写出来仅仅为了理解方便。binarySearch()只能用于已排好序的数组中。所以,你会发现下面结果很奇怪。
useArraysBinarySearch(String[] arr, String targetValue) {
a =& Arrays.binarySearch(arr, targetValue);
&&&&&&&&return
&&&&&&&&return
2.时间复杂度
通过下面的这段代码可以近似比较几个方法的时间复杂度。虽然分别搜索一个大小为5、1K、10K的数组是不够精确的,但是思路是清晰的。
main(String[] args) {
&&&&String[]
String[] {& &CD&,&
startTime = System.nanoTime();
i & 100000;
i++) {
&&&&&&&&useList(arr,
endTime = System.nanoTime();
duration = endTime - startT
&&&&System.out.println(&useList:&
+ duration / 1000000);
&&&&startTime
= System.nanoTime();
i & 100000;
i++) {
&&&&&&&&useSet(arr,
&&&&endTime
= System.nanoTime();
&&&&duration
= endTime - startT
&&&&System.out.println(&useSet:&
+ duration / 1000000);
&&&&startTime
= System.nanoTime();
i & 100000;
i++) {
&&&&&&&&useLoop(arr,
&&&&endTime
= System.nanoTime();
&&&&duration
= endTime - startT
&&&&System.out.println(&useLoop:&
+ duration / 1000000);
&&&&startTime
= System.nanoTime();
i & 100000;
i++) {
&&&&&&&&useArraysBinarySearch(arr,
&&&&endTime
= System.nanoTime();
&&&&duration
= endTime - startT
&&&&System.out.println(&useArrayBinary:&
+ duration / 1000000);
useArraysBinarySearch:&
对于长度为1K的数组:
String[1000];
i++){
&&&&arr[i]
= String.valueOf(s.nextInt());
useArrayBinary:&
对于长度为10K的数组:
String[10000];
i++){
&&&&arr[i]
= String.valueOf(s.nextInt());
useArrayBinary:&
很明显,使用简单循环的方法比使用其他任何集合效率更高。许多开发者会使用第一种方法,但是它并不是高效的。将数组压入Collection类型中,需要首先将数组元素遍历一遍,然后再使用集合类做其他操作。
如果使用Arrays.binarySearch()方法,数组必须是已排序的。由于上面的数组并没有进行排序,所以该方法不可使用。
实际上,如果你需要借助数组或者集合类高效地检查数组中是否包含特定值,一个已排序的列表或树可以做到时间复杂度为O(log(n)),hashset可以达到O(1)。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:110057次
积分:1406
积分:1406
排名:千里之外
原创:13篇
转载:182篇
评论:10条
(3)(5)(3)(15)(6)(6)(13)(1)(4)(11)(5)(9)(7)(11)(7)(8)(1)(14)(15)(6)(1)(15)(9)(10)(5)(2)(4)后使用快捷导航没有帐号?
查看: 7720|回复: 3
各位高手:& && &&&如题,例如,有一个很大的数组,其中的元素大概可以达到上千个吧。而这时我想查看一个元素是不是存在于这个数组中如何实现?& && &&&实际的问题是这样的,我拿到了一份很大的 verilog文件。其中有很多的module.现在由于某种原因想把verilog中的每一个module加一个前缀名。因为verilog中module定义后,是要被调用的。把module名加了前缀后,调用的部分也要加。所以,我想第一次遍历文件的时候把module名放进一个数组。再查看调用的相关行,例化名如果存在于module所存在的数组中就要加一个前缀,以便与改过的module对应起来。但是我实际这么做的时候发现,这人脚本运行起来很慢,主要原因是确定例化名在不在数组的循环太费时。& && &&&所以,我想问一问,有没有什么方法可以很快的确定数组中包含不包含某一元素。 注,不要用5.10以后的方法。要用5.10以前的方法,如果能提供一个模块来实现就更好了。谢谢了。
建议用hash数组,用if(exist $hash{$key}){...}
ly5132 发表于
建议用hash数组,用if(exist $hash{$key}){...}
非常感谢,我试过了,速度果然快了不止100倍.
应该是exists
Powered by Discuz!
& Comsenz Inc.Java基础(10)

如何检查一个未排序的数组中是否包含某个特定值,这是一个在Java中非常实用并且频繁使用的操作。另外,这也是Stack Overflow上面非常受关注的问题。在得票数最多的答案中,可以看到,检查数组中是否包含特定值可以用多种不同的方式实现,但是时间复杂度差别很大。下面,我将为大家展示各种方法及其需要花费的时间。
1.检查数组中是否包含特定值的四种不同方法
1)使用List:
useList(String[] arr, String targetValue) {
&&&&return
Arrays.asList(arr).contains(targetValue);
2)使用Set:
useSet(String[] arr, String targetValue) {
&&&&Set&String&
HashSet&String&(Arrays.asList(arr));
&&&&return
set.contains(targetValue);
3)使用一个简单循环:
useLoop(String[] arr, String targetValue) {
&&&&for(String
&&&&&&&&if(s.equals(targetValue))
&&&&&&&&&&&&return
&&&&return
4)使用Arrays.binarySearch():
注:下面的代码是错误的,这样写出来仅仅为了理解方便。binarySearch()只能用于已排好序的数组中。所以,你会发现下面结果很奇怪。
useArraysBinarySearch(String[] arr, String targetValue) {
a =& Arrays.binarySearch(arr, targetValue);
&&&&&&&&return
&&&&&&&&return
2.时间复杂度
通过下面的这段代码可以近似比较几个方法的时间复杂度。虽然分别搜索一个大小为5、1K、10K的数组是不够精确的,但是思路是清晰的。
main(String[] args) {
&&&&String[]
String[] {& &CD&,&
startTime = System.nanoTime();
i & 100000;
i++) {
&&&&&&&&useList(arr,
endTime = System.nanoTime();
duration = endTime - startT
&&&&System.out.println(&useList:&
+ duration / 1000000);
&&&&startTime
= System.nanoTime();
i & 100000;
i++) {
&&&&&&&&useSet(arr,
&&&&endTime
= System.nanoTime();
&&&&duration
= endTime - startT
&&&&System.out.println(&useSet:&
+ duration / 1000000);
&&&&startTime
= System.nanoTime();
i & 100000;
i++) {
&&&&&&&&useLoop(arr,
&&&&endTime
= System.nanoTime();
&&&&duration
= endTime - startT
&&&&System.out.println(&useLoop:&
+ duration / 1000000);
&&&&startTime
= System.nanoTime();
i & 100000;
i++) {
&&&&&&&&useArraysBinarySearch(arr,
&&&&endTime
= System.nanoTime();
&&&&duration
= endTime - startT
&&&&System.out.println(&useArrayBinary:&
+ duration / 1000000);
useArraysBinarySearch:&
对于长度为1K的数组:
String[1000];
i++){
&&&&arr[i]
= String.valueOf(s.nextInt());
useArrayBinary:&
对于长度为10K的数组:
String[10000];
i++){
&&&&arr[i]
= String.valueOf(s.nextInt());
useArrayBinary:&
很明显,使用简单循环的方法比使用其他任何集合效率更高。许多开发者会使用第一种方法,但是它并不是高效的。将数组压入Collection类型中,需要首先将数组元素遍历一遍,然后再使用集合类做其他操作。
如果使用Arrays.binarySearch()方法,数组必须是已排序的。由于上面的数组并没有进行排序,所以该方法不可使用。
实际上,如果你需要借助数组或者集合类高效地检查数组中是否包含特定值,一个已排序的列表或树可以做到时间复杂度为O(log(n)),hashset可以达到O(1)。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:26210次
排名:千里之外
原创:15篇
转载:75篇问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
JS有什么办法可以快速找出数组里是否有某个值?
这是我常用的方法,感觉好累赘,有没有社么好办法?
function contains(arr, val) {
for (var i = 0; i & arr. i++) {
if (arr[i] === val) {
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
可以使用array的indexOf方法,参考
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
jsfunction contains(arr, val) {
if (arr.indexOf(val) !== -1) {
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App

我要回帖

 

随机推荐