পিএইচপি এর গণনা () ফাংশন O (1) বা অ্যারেগুলির জন্য ও (এন) রয়েছে?


98

না count()সত্যিই, সমস্ত একটি পিএইচপি অ্যারের উপাদানের গণনা বা এই মান কোথাও ক্যাসে নিয়ে যাওয়া হয় এবং মাত্র উদ্ধার করা পায়?


7
কেন এটি পরীক্ষা না? এটি এমন লুপ করতে যথেষ্ট সহজ যা অ্যারেতে উপাদান যুক্ত করে এবং প্রতিটি সময় গণনা করে এবং কিছু সময় করে।
মার্ক বি

4
এই প্রশ্নটি একবার দেখুন: stackoverflow.com/questions/2473989/…
পিক্সেল বিকাশকারী

গুগল কীওয়ার্ডস - এই প্রশ্নটি এই রূপেও তৈরি করা যেতে পারে: পিএইচপি কি গণনা করে () অ্যারেতে পুনরাবৃত্তি করে না এটি অ্যারে সম্পত্তি থেকে গণনা পুনরুদ্ধার করে?
jave.web

উত্তর:


138

ঠিক আছে, আমরা উত্সটি দেখতে পারি:

/ext/standard/array.c

PHP_FUNCTION(count)কলগুলি php_count_recursive(), যা ঘুরে ফিরে zend_hash_num_elements()নন-রিকার্সিভ অ্যারে কল করে , যা এইভাবে প্রয়োগ করা হয়:

ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
    IS_CONSISTENT(ht);

    return ht->nNumOfElements;
}

সুতরাং আপনি দেখতে পারেন, এটি O(1)জন্য $mode = COUNT_NORMAL


6
তবে কী করে IS_CONSISTENT(ht)?
ম্যাথু

4
ধন্যবাদ! আমার উত্সটি কোথায় খুঁজে পাওয়া উচিত বা কোথায় উত্সটি পাওয়া উচিত (কোনও সংগ্রহস্থল এটি পরীক্ষা করে দেখে না নিয়ে) আমি নিশ্চিত ছিলাম না।
ডেক্সটার

4
@ ম্যাট এটি দেখতে পাচ্ছে যে হ্যাশ কাঠামোটি বৈধ কিনা, আমি দেখতে পাচ্ছি। এটি zend_hash.c এ সংজ্ঞায়িত করা হয়েছে এবং এটি ও (1) এও।
ভ্লাদিস্লাভ রাস্ট্রুসনি

10
পিএইচপি এর উত্স
কোডটিতে

4
@ ম্যাট আইএস_সনসিস্ট্যান্ট () অ্যারে github.com/php/php-src/blob/PHP-5.3/ জেন্ডার
জন কার্টার

7

পিএইচপি 5+ এ দৈর্ঘ্য অ্যারেতে সংরক্ষণ করা হয় যাতে প্রতিবার গণনা করা হয় না।

সম্পাদনা: আপনি এই বিশ্লেষণটি আকর্ষণীয়ও দেখতে পাবেন: পিএইচপি গণনা সম্পাদনা । যদিও অ্যারের দৈর্ঘ্য অ্যারে দ্বারা বজায় রাখা হয়, তবুও মনে হয় এটির কাছে রাখা যদি আপনি count()অনেকবার কল করে চলেছেন তবে এটি আরও দ্রুত ।


আমি মনে করি আপনি সঠিক হতে পারেন যে এই পরিবর্তনটি পিএইচপি 5 দিয়ে শুরু হয়েছিল However তবে, আমি এখনও প্রমাণ পাইনি যে পিএইচপি 4 হ'ল গণনা () জন্য (ও) ছিল; আমি কেবল কাহিনীমূলক মন্তব্য দেখতে পাচ্ছি। আপনি কি প্রমাণ (যেমন পিএইচপি 4 এর জন্য গণনা () প্রয়োগ করতে পারবেন)? ধন্যবাদ,
ক্রিস্টোফার উইন্ডসর

3

পিএইচপি অভ্যন্তরীণভাবে একটি অ্যারের আকার সঞ্চয় করে, তবে আপনি এখনও একটি ফাংশন কল করছেন যা যখন না তৈরির চেয়ে ধীর হয়, তাই আপনি যদি ফলটি কোনও ভেরিয়েলে সংরক্ষণ করতে চান তবে যদি আপনি এটি কোনও ব্যবহার করার মতো কিছু করেন তবে লুপ:

উদাহরণ স্বরূপ,

$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
   foo($array[$i]);
}

অতিরিক্তভাবে, আপনি সর্বদা নিশ্চিত হতে পারবেন না যে countকোনও অ্যারেতে ডাকা হচ্ছে। যদি Countableউদাহরণস্বরূপ কার্যকর করে এমন কোনও বস্তুর উপরে যদি এটি ডাকা হয় , তবে countসেই বস্তুর পদ্ধতিটি কল করা হবে।


ফলোআপ হিসাবে আপনি josephscott.org/archives/2010/01/php-count-performance পড়তে চাইতে পারেন এটি মূলত অ্যারে দৈর্ঘ্য কীভাবে ও (1) পাওয়া যায় এবং পুনরাবৃত্তি ফাংশন কলগুলির প্রভাব সম্পর্কে তা বিশদ করে।
দ্য ক্লেয়ার

4
একটি ফাংশন কল করা কি একটি না করার চেয়ে সবসময় ধীর হয়? দোভাষীকে ইনলাইন অপটিমাইজেশন পাওয়ার জন্য আমি অবাক হব না।
কর্সিকা

4
the count method of that object will be called, আপনি কি দয়া করে এটি কিছুটা ব্যাখ্যা করতে পারেন
ইস্পাত মস্তিষ্ক

4
@ স্টিলব্রেন যদি কোনও শ্রেণি Countableইন্টারফেস প্রয়োগ করে তবে কল count($object)করা কল করা একই জিনিস $object->count()। উদাহরণস্বরূপ 3v4l.org/oYSSC দেখুন ।
এমফোন্ডা

you're still making a function call when which is slower than not making oneএই বক্তব্য ভুল হতে পারে। আপনি যদি ম্যানুয়াল ট্র্যাভারসাল করছেন তবে এটি O(n)অপারেশন। আপনি যদি কেবল প্রাক গণনা করা মানটি পুনরুদ্ধার করতে চান তবে অপারেশন O(1)
জামশাদ আহমদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.