向量与数组
向量与数组的不同在于,向量是数组结构的一般性推广。数组在创建时内部空间已经确定,是静态的内存管理办法。向量内部空间是动态的内存管理办法。
在Java中,ArrayList 与 Vector都是这种数据结构.
ArrayList 与 Vector的区别
- Vector的方法都是线程安全的,同步的,而ArrayList不是,由于线程同步必然会影响性能,因此ArrayList的性能比Vector好。
- 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。
向量其实就是在内部实现了一个数组.
有序性向量
有序性甄别
/*
/*
* 有序性甄别
* 核心思路:任何一个有序向量,其相邻元素对必定是逆序或是顺序的。
*
* */
public int disordered(Vector<Integer> v) {
int n = 0;
for(int i = 1 ; i < v.size() ; i++) {
if(v.get(i - 1) > v.get(i))
n++;
}
return n;
}
唯一化
==低效版本==
/*
此版本因为调用remove()函数,每发现一个重复元素都需要执行删除,再排序。
其中
oldSize 是数组原大小
*/
pubilc int uniquify(){
int oldSize = _size, i = 1;
while(i < _size){
_elem[i - 1]== _elme[i] ? remove(i):i++;//如果有重复元素,执行删除操作,否则i++;
}
return oldSize - _size;//此处为伪代码,_size并没有做处理
}
==高效版本==
/*
* 有序向量去重
此版本,如果元素没有出现雷同
则 i 与 j 同时实现自增。
如果元素出现雷同,
则 i 不变,j 自增,直到元素不相同或者退出循环
此时如果出现元素不相同,
则执行v.set(++i,v.get(j),
相当于将j - i个重复元素忽略。
最后再进行缩容量
*/
/*
* 存在比较问题,是否会比较对象地址而不是比较值
* 经不严谨类举实验,当Vector<Integer>用==比较的是值而不是对象的地址
*/
public int uniquify(Vector<Integer> v) {
int i = 0 , j = 0;
while(++j < v.size()) {
if( v.get(i) != v.get(j)) {
v.set(++i,v.get(j));
}
}
//缩小容量.
v.setSize(++i);