当前位置: 首页 > news >正文

企业网站多少钱一个做网站要用那些软件

企业网站多少钱一个,做网站要用那些软件,学做网站要学什么软件,柞水县住房和城乡建设局网站1. 常见的错误 这里我要特别纠正一个“错误”。我在面试的时候,常常会问数组和链表的区别,很多人都回答说,“链表适合插入、删除,时间复杂度O(1);数组适合查找,查找时间复杂度为O(1)”。 实际上&#xff…

1. 常见的错误

这里我要特别纠正一个“错误”。我在面试的时候,常常会问数组和链表的区别,很多人都回答说,“链表适合插入、删除,时间复杂度O(1);数组适合查找,查找时间复杂度为O(1)”。

实际上,这种表述是不准确的。数组是适合查找操作,但是查找的时间复杂度并不为O(1)。即便是排好序的数组,你用二分查找,时间复杂度也是O(logn)。所以,正确的表述应该是,数组支持随机访问,根据下标随机访问的时间复杂度为O(1)。

2. 插入的优化

数组插入操作是O(n),但某些情况可以优化

如果数组中的数据是有序的,我们在某个位置插入一个新的元素时,就必须按照刚才的方法搬移k之后的数据。但是,如果数组中存储的数据并没有任何规律,数组只是被当作一个存储数据的集合。在这种情况下,如果要将某个数据插入到第k个位置,为了避免大规模的数据搬移,我们还有一个简单的办法就是,直接将第k位的数据搬移到数组元素的最后,把新的元素直接放入第k个位置。为了更好地理解,我们举一个例子。假设数组a[10]中存储了如下5个元素:a,b,c,d,e。

我们现在需要将元素x插入到第3个位置。我们只需要将c放入到a[5],将a[2]赋值为x即可。最后,数组中的元素如下: a,b,x,d,e,c

利用这种处理技巧,在特定场景下,在第k个位置插入一个元素的时间复杂度就会降为O(1)。这个处理思想在快排中也会用到,我会在排序那一节具体来讲,这里就说到这儿。

3.  删除操作的优化

跟插入数据类似,如果我们要删除第k个位置的数据,为了内存的连续性,也需要搬移数据,不然中间就会出现空洞,内存就不连续了。

和插入类似,如果删除数组末尾的数据,则最好情况时间复杂度为O(1);如果删除开头的数据,则最坏情况时间复杂度为O(n);平均情况时间复杂度也为O(n)。

实际上,在某些特殊场景下,我们并不一定非得追求数组中数据的连续性。如果我们将多次删除操作集中在一起执行,删除的效率是不是会提高很多呢?

我们继续来看例子。数组a[10]中存储了8个元素:a,b,c,d,e,f,g,h。现在,我们要依次删除a,b,c三个元素。

为了避免d,e,f,g,h这几个数据会被搬移三次,我们可以先记录下已经删除的数据。每次的删除操作并不是真正地搬移数据,只是记录数据已经被删除。当数组没有更多空间存储数据时,我们再触发执行一次真正的删除操作,这样就大大减少了删除操作导致的数据搬移。

如果你了解JVM,你会发现,这不就是JVM标记清除垃圾回收算法的核心思想吗?没错,数据结构和算法的魅力就在于此, 很多时候我们并不是要去死记硬背某个数据结构或者算法,而是要学习它背后的思想和处理技巧,这些东西才是最有价值的。如果你细心留意,不管是在软件开发还是架构设计中,总能找到某些算法和数据结构的影子。

4.为什么大多数编程语言中,数组要从0开始编号,而不是从1开始呢?

如果数组从1开始计数,那我们计算数组元素a[k]的内存地址就会变为:

a[k]_address = base_address + (k-1)*type_size

从1开始编号,每次随机访问数组元素都多了一次减法运算,对于CPU来说,就是多了一次减法指令。

不过我认为,上面解释得再多其实都算不上压倒性的证明,说数组起始编号非0开始不可。所以我觉得最主要的原因可能是历史原因。

C语言设计者用0开始计数数组下标,之后的Java、JavaScript等高级语言都效仿了C语言,或者说,为了在一定程度上减少C语言程序员学习Java的学习成本,因此继续沿用了从0开始计数的习惯。实际上,很多语言中数组也并不是从0开始计数的,比如Matlab。甚至还有一些语言支持负数下标,比如Python。

5.总结

作为高级语言编程者,是不是数组就无用武之地了呢?当然不是,有些时候,用数组会更合适些,我总结了几点自己的经验。

1.Java ArrayList无法存储基本类型,比如int、long,需要封装为Integer、Long类,而Autoboxing、Unboxing则有一定的性能消耗,所以如果特别关注性能,或者希望使用基本类型,就可以选用数组。

2.如果数据大小事先已知,并且对数据的操作非常简单,用不到ArrayList提供的大部分方法,也可以直接使用数组。

3.还有一个是我个人的喜好,当要表示多维数组时,用数组往往会更加直观。比如Object[][] array;而用容器的话则需要这样定义:ArrayList<ArrayList > array。

我总结一下,对于业务开发,直接使用容器就足够了,省时省力。毕竟损耗一丢丢性能,完全不会影响到系统整体的性能。但如果你是做一些非常底层的开发,比如开发网络框架,性能的优化需要做到极致,这个时候数组就会优于容器,成为首选。

http://www.yayakq.cn/news/279651/

相关文章:

  • 网站做视频链接网站开发文档实训小结与讨论
  • 台州外贸网站建设宁波哪里做网站
  • 专门做尾单的那个网站叫啥编程入门先学什么0基础
  • 为学校网站做网站推广策划书wordpress 添加 联系我们
  • 做服装哪个网站图片多wordpress 段子模板
  • zion小程序官网网络营销中的seo是指
  • 网站页面太多怎么做网站地图旅行社销售网站建设方案
  • 利于seo的建站系统有哪些北京企业网站
  • 秦皇岛开发区建设局网站wordpress用户组可见
  • 网站搭建报价单长沙品牌设计公司排行榜
  • 无锡网站关键词推广北京医疗网站建设
  • 怎么给别人做网站网站外贸推广引流系统
  • 禁止同ip网站查询做司法考试题目的网站
  • 学院的网站建设的意义网站开发分支结构
  • 网站做seo推广方案正规的网站制作哪个好
  • 中国万网icp网站备案专题贵州seo排名
  • 全国专业做美术网站的公司做推广网站的文章
  • 网站备案需要材料网站建设成本明细
  • 苏州建设网站教程安卓应用开发语言
  • 旅游网站设计思路毕业设计网站设计步骤
  • 自己怎么手机做网站青岛网上房地产网站
  • 学做网站用谁的书广告公司推广方案
  • 自贡网站设计php网站怎么做自适应
  • 长沙哪个公司做网站建设一个网站项目预算
  • 记事本做网站插图片想象力做网站
  • 襄阳网站推广优化技巧三角形景观绿化设计图
  • asp 做网站9 1短视频安装
  • 海南电子商务网站杭州网站制作公司网站
  • 网站的国际化 怎么做网片价格
  • 网站建设360网站推广平台